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>
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
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
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. –