2013-06-19 19 views
9

Próbuję zaimplementować niestandardową stronę widoku MVC w celu "przesłonięcia" typu właściwości User. Dzięki temu mój typ CustomPrincipal będzie dostępny w każdym widoku.Implementacja niestandardowej widok bazy MVC Strona

Po przeszukaniu internetu znalazłem Phil Haack's instructions for implementing a custom base view page. Postępowałem zgodnie z instrukcjami dokładnie tak, jak są napisane, ale napotkałem problem podczas uzyskiwania dostępu do właściwości w widoku.

Kiedy otwieram widok, wszelkie poprzednie działania helpera HTML są podkreślone niebieską, falistą linią. Kiedy umieściłem kursor nad częścią @Html, ujawnia się błąd:

"Html jest niejednoznaczny, zaimportowany z przestrzeni nazw lub typów" System.Web.WebPages, System.Web.Mvc "."

Teraz rozumiem, dlaczego otrzymuję wiadomość, ale nie rozumiem, jak to naprawić. Nie wiem, dlaczego miałoby to znaczenie, ale obecna aplikacja została stworzona w języku Visual Basic. Jako test wtórny utworzyłem inną aplikację MVC w języku C# i próbowałem zaimplementować niestandardową stronę widoku podstawowego. W aplikacji C# działało dobrze. Mogę uzyskać dostęp do mojej niestandardowej właściwości z poziomu widoków.

Przeszukałem sieć w poszukiwaniu odpowiedzi na ten problem, ale jak dotąd niczego nie znalazłem. Czy ktoś inny ma podobny problem?

Dla porównania, włączyłem mój niestandardowej strony widok podstawy i ~/Views/web.config poniżej:

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

Zrozum, co chcesz zrobić. Dlaczego WebViewPage? Dlaczego nie oglądać? Nie ma WebViewPage w MVC lub jestem miss czegoś. I zwykle Principal użytkownika jest częścią HttpContext. – maxs87

+1

W rzeczywistości 'WebViewPage' jest w rzeczywistości [częścią struktury MVC] (http://msdn.microsoft.com/en-us/library/gg402107%28v=vs.98%29.aspx). I tak, właściwość "User" jest częścią 'HttpContext' i jest dostępna poprzez widok. Co mogę zrobić, to uzyskać dostęp do właściwości 'User', ale użyj strony widoku podstawowego, aby zmienić typ tej właściwości na moją' CustomPrincipal' zamiast 'IPrincipal'. Ma sens? – hitopp

+2

Szczerze mówiąc, uważam, że jest to zbyt skomplikowane, aby uniknąć samodzielnego rzucania użytkownika. Jeśli często go używasz, po prostu utworzę metodę rozszerzenia dla IPrinciple, która ją rzuci. Znacznie mniej wysiłku i nie trzeba wykonywać dodatkowego kodu na każdej stronie. Pamiętaj, że musisz również czerpać z kontrolera i prawdopodobnie ApiController oraz kilku innych. Jest to uosobienie O w SOLID, która jest zasadą Open/Closed. Dziedziczenie narusza OCP. –

Odpowiedz

3

Trzeba w celu zapewnienia 2 wersji WebViewPage, ogólnej i nietypowej.

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


public class BaseViewPage : WebViewPage 
{ 
}