2013-06-19 3 views
9

Я пытаюсь реализовать страницу пользовательского базового представления MVC, чтобы «переопределить» тип свойства User. Это сделает мой тип CustomPrincipal доступным в любом представлении.Внедрение пользовательской базы данных MVC Page

После поиска в Интернете я нашел Phil Haack's instructions for implementing a custom base view page. Я выполнял инструкции точно так, как они написаны, но я столкнулся с проблемой при доступе к свойствам в представлении.

Когда я открываю представление, любые предыдущие действия html-помощника подчеркиваются синей, squiggly-строкой. Когда я наводил курсор на участок @Html, он обнаруживает ошибку:

«Html неоднозначен, импортирован из пространств имен или типов« System.Web.WebPages, System.Web.Mvc ».

Теперь я понимаю, почему я получаю сообщение, но я не понимаю, как его исправить. Я не знаю, почему это имеет значение, но текущее приложение было создано в Visual Basic. В качестве вторичного теста я создал другое приложение MVC на C# и попытался реализовать пользовательскую страницу базового представления. В приложении C# он работал нормально. Я могу получить доступ к своему пользовательскому свойству из представлений.

Я просмотрел веб-страницы, ища ответ на этот вопрос, но пока ничего не нашел. Кто-нибудь еще сталкивается с подобной проблемой?

Для справки, я включил мою пользовательскую страницу базы просмотра и ~/Views/web.config ниже:

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

Не знаю, что вы пытаетесь сделать. Почему WebViewPage? Почему бы не посмотреть? В MVC нет WebViewPage, или я что-то пропустил. Обычный пользователь обычно является частью HttpContext. – maxs87

+1

Фактически, 'WebViewPage' фактически является [частью структуры MVC] (http://msdn.microsoft.com/en-us/library/gg402107%28v=vs.98%29.aspx). И да, свойство «Пользователь» является частью «HttpContext» и доступно через представление. То, что я хочу сделать, - это доступ к свойству 'User', но используйте страницу базового представления, чтобы изменить тип этого свойства на мой« CustomPrincipal », а не на« IPrincipal ». Имеют смысл? – hitopp

+2

Честно говоря, я чувствую, что это слишком много возиться просто, чтобы не бросать Пользователь самостоятельно. Если вы используете его часто, я бы просто создал метод расширения для IPrinciple, который его отличает. Намного меньше усилий, и не нужно делать дополнительный код на каждой странице. Помните, что вы также должны получить от Controller, а также ApiController и несколько других. Это является воплощением O в SOLID, который является принципом Open/Closed. Наследование нарушает OCP. –

ответ

3

Вам нужно для предоставления двух версий WebViewPage, общих и не общих.

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


public class BaseViewPage : WebViewPage 
{ 
}