2013-06-19 35 views
9

Tôi đang cố gắng triển khai trang chế độ xem cơ sở tùy chỉnh MVC để "ghi đè" loại thuộc tính User. Điều này sẽ làm cho loại CustomPrincipal của tôi có thể truy cập được trong bất kỳ chế độ xem nào.Triển khai Trang xem cơ sở MVC tùy chỉnh

Sau khi tìm kiếm trên web, tôi đã tìm thấy Phil Haack's instructions for implementing a custom base view page. Tôi đã làm theo hướng dẫn chính xác như chúng được viết, nhưng tôi đã gặp phải vấn đề khi truy cập các thuộc tính trong khung nhìn.

Khi tôi mở một chế độ xem, mọi hành động trợ giúp của Html trước đó được gạch chân bằng đường kẻ màu xanh dương, vằn. Khi tôi đặt con trỏ lên phần @Html, nó sẽ hiển thị lỗi:

"Html không rõ ràng, được nhập từ không gian tên hoặc loại 'System.Web.WebPages, System.Web.Mvc'."

Bây giờ, tôi hiểu tại sao tôi nhận được thông báo nhưng tôi không hiểu cách khắc phục. Tôi không biết tại sao điều này lại quan trọng, nhưng ứng dụng hiện tại được tạo ra trong Visual Basic. Là một thử nghiệm thứ cấp, tôi đã tạo một ứng dụng MVC khác trong C# và cố gắng triển khai trang xem cơ sở tùy chỉnh. Trong ứng dụng C# nó hoạt động tốt. Tôi có thể truy cập thuộc tính tùy chỉnh của mình từ trong chế độ xem.

Tôi đã tìm kiếm trang web để tìm câu trả lời cho vấn đề này, nhưng cho đến nay vẫn chưa tìm thấy bất kỳ điều gì. Có ai khác chạy vào một vấn đề tương tự?

Để tham khảo, tôi bao gồm trang của tôi tùy chỉnh quan điểm cơ bản và ~/Views/web.config dưới đây:

BaseViewPage

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web.Mvc; 
using CCInfoController; 

namespace CCInfo.Web.Mvc 
{ 
    public class BaseViewPage<TModel> : WebViewPage<TModel> 
    { 
     public new CustomPrincipal User 
     { 
      get 
      { 
       return base.User as CustomPrincipal; 
      } 
     } 

     public override void Execute() 
     { 
     } 
    } 
} 

~/Views/web.config

<configuration> 
    <configSections> 
    <sectionGroup name="system.web.webPages.razor" 
     type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, 
     System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, 
     PublicKeyToken=31BF3856AD364E35"> 
    <section name="host" 
     type="System.Web.WebPages.Razor.Configuration.HostSection, 
     System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, 
     PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> 
    <section name="pages" 
     type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, 
     System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, 
     PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> 
    </sectionGroup> 
    </configSections> 

    <system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, 
     System.Web.Mvc, Version=3.0.0.0, Culture=neutral, 
     PublicKeyToken=31BF3856AD364E35" /> 
    <pages pageBaseType="CCInfo.Web.Mvc.BaseViewPage"> 
     <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="System.Web.WebPages"/> 
     <add namespace="CCInfoController" /> 
     </namespaces> 
    </pages> 
    </system.web.webPages.razor> 
    ... 
</configuration> 
+0

Không thể hiểu được những gì bạn đang cố gắng làm. Tại sao lại sử dụng WebViewPage? Tại sao không xem? Không có WebViewPage trong MVC hoặc tôi bỏ lỡ một cái gì đó. Và bình thường của người dùng chính là một phần của HttpContext. – maxs87

+1

Trên thực tế, 'WebViewPage' thực tế là [một phần của khung MVC] (http://msdn.microsoft.com/en-us/library/gg402107%28v=vs.98%29.aspx). Và có, thuộc tính 'Người dùng' là một phần của 'HttpContext' và có thể truy cập thông qua chế độ xem. Những gì tôi muốn có thể làm là truy cập thuộc tính 'User', nhưng sử dụng trang xem cơ sở để thay đổi kiểu thuộc tính đó thành' CustomPrincipal' của tôi thay vì 'IPrincipal'. Có lý? – hitopp

+2

Thành thật mà nói, tôi cảm thấy rằng điều này là quá nhiều lộn xộn xung quanh chỉ đơn giản là để tránh đúc người dùng chính mình. Nếu bạn sử dụng nó thường xuyên, tôi sẽ chỉ tạo ra một phương pháp mở rộng cho IPrinciple mà phôi nó. Ít nỗ lực hơn và không cần phải làm thêm mã trong mỗi trang. Hãy nhớ rằng, bạn cũng phải lấy được từ Controller, và có thể là ApiController, và một số thứ khác. Đây là hình ảnh thu nhỏ của O trong SOLID, là nguyên tắc Open/Closed. Thừa kế vi phạm OCP. –

Trả lời

3

Bạn cần cung cấp 2 phiên bản của WebViewPage, một phiên bản chung chung và không chung chung.

public class BaseViewPage<TModel> : WebViewPage<TModel> 
{ 
} 


public class BaseViewPage : WebViewPage 
{ 
} 
Các vấn đề liên quan