2013-06-19 12 views
9

Ich versuche, eine benutzerdefinierte MVC-Basisansichtsseite zu implementieren, um den User-Eigenschaftstyp zu überschreiben. Dadurch wird mein Typ CustomPrincipal in jeder Ansicht zugänglich.Implementieren einer benutzerdefinierten MVC-Basisansichtsseite

Nach der Suche im Internet fand ich Phil Haack's instructions for implementing a custom base view page. Ich befolgte die Anweisungen genau so, wie sie geschrieben wurden, aber beim Zugriff auf die Eigenschaften in der Ansicht stieß ich auf ein Problem.

Wenn ich eine Ansicht öffne, werden alle vorherigen HTML-Hilfsaktionen mit der blauen, schlangenartigen Linie unterstrichen. Wenn ich den Cursor über den Bereich @Html setze, wird der Fehler angezeigt:

"HTML ist mehrdeutig, importiert von den Namespaces oder Typen 'System.Web.WebPages, System.Web.Mvc'."

Jetzt verstehe ich, warum ich die Nachricht erhalte, aber ich verstehe nicht, wie ich es beheben soll. Ich weiß nicht, warum das wichtig wäre, aber die aktuelle Anwendung wurde in Visual Basic erstellt. Als zweiten Test habe ich eine andere MVC-Anwendung in C# erstellt und versucht, die benutzerdefinierte Basisansichtsseite zu implementieren. In der C# -Anwendung hat es gut funktioniert. Ich kann über die Ansichten auf meine benutzerdefinierte Eigenschaft zugreifen.

Ich habe das Web auf der Suche nach einer Antwort auf dieses Problem, aber bisher noch nichts gefunden. Ist sonst jemand auf ein ähnliches Problem gestoßen?

Als Referenz eingeschlossen ich meine benutzerdefinierte Basisansicht Seite und ~/Views/web.config unter:

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

Kann nicht verstehen, was Sie versuchen zu tun. Warum WebViewPage? Warum nicht sehen? Es gibt keine WebViewPage in MVC oder ich bin etwas falsch.Und User Principal ist normalerweise ein Teil von HttpContext. – maxs87

+1

Tatsächlich ist 'WebViewPage' tatsächlich ein Teil des MVC-Frameworks (http://msdn.microsoft.com/en-us/library/gg402107%28v=vs.98%29.aspx). Und ja, die Eigenschaft 'Benutzer' ist Teil des 'HttpContext' und ist über die Ansicht zugänglich. Ich möchte in der Lage sein, auf diese 'User'-Eigenschaft zuzugreifen, aber die Basisansichtsseite zu verwenden, um den Typ dieser Eigenschaft in' CustomPrincipal' statt 'IPrincipal' zu ändern. Sinn ergeben? – hitopp

+2

Ehrlich gesagt, ich fühle, dass dies zu viel Unsinn ist, nur um zu vermeiden, den User selbst zu werfen. Wenn Sie es häufig verwenden, würde ich nur eine Erweiterungsmethode für IPrinciple erstellen, die es umwandelt. Viel weniger Aufwand und keine Notwendigkeit, den zusätzlichen Code in jeder Seite zu tun. Denken Sie daran, dass Sie auch von Controller und möglicherweise ApiController und mehreren anderen ableiten müssen. Dies ist der Inbegriff des O in SOLID, welches das Open/Closed-Prinzip ist. Inheritance verletzt OCP. –

Antwort

3

Sie benötigen um 2 Versionen der WebViewPage bereitzustellen, eine generische und nicht-generische.

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


public class BaseViewPage : WebViewPage 
{ 
} 
Verwandte Themen