【问题标题】:ASP.NET MVC strongly typed master page out of Views folderViews 文件夹中的 ASP.NET MVC 强类型母版页
【发布时间】:2010-10-30 18:30:46
【问题描述】:

我有一个 MVC 应用程序,它带有实现主题选择的自定义视图引擎,即视图母版页的动态设置。描述了应用程序结构 here 问题是母版页存在于 Views 文件夹中的默认位置之外。 (那是因为我希望所有与主题相关的文件,即 css 和图像与 master 放在一个地方。将 css 放入 Views 会破坏安全问题 - 默认视图的 web.config 不允许访问那里的任何内容,并且我宁愿保持这种方式。)一切正常,直到我尝试将母版页更改为强类型,即指定

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<MyApp.Models.BaseModel>" %>

然后页面抛出错误:

无法加载 System.Web.Mvc.ViewMasterPage

.

那么,有没有办法将该命名空间导入到需要的位置?要更改 web.config 中的某些设置(我假设在 Views 文件夹中)或其他地方?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    这是一个猜测...但是当您尝试在视图代码中使用名称空间(例如,对于 HTML Helpers)时,您会遇到这些错误,而视图引擎无法引用,您可以通过将其添加到web.config 部分。

    所以也许这可以解决它?

    <add namespace="MyApp.Models"/>
    

    【讨论】:

      【解决方案2】:

      您始终可以将信息作为 ViewData 传递并将其转换回强类型。或者您可以创建一个 ViewDataFacade 类,以便在类本身中处理转换。

      更新:

      控制器(或控制器库中的类似内容):

      public class MyController
      {
        public ActionResult Index()
        {
          ViewData["MyComplexType"] = GetMyComplexType();
      
          return View();
        }
      }
      

      ViewDataFacade 类是这样的:

      public class ViewDataFacade
      {
        public MyClass MyComplexType { get; set; }
      
        public ViewDataFacade(ViewDataDictionary viewData)
        {
          //If it exists, cast the viewdata object as MyComplexType, or return a new instance.
          this.MyComplexType = viewData["MyComplexType"] != null ? (MyClass)viewData["MyComplexType"] : new MyClass();
        }
      }
      

      查看:

      <%-- Constructor for the ViewDataFacade takes the current ViewData --%>
      <% ViewDataFacade viewData = new ViewDataFacade(ViewData); %>
      
      <%-- Example of MyComplexType that is a collection, with a single item (MyProperty) --%>
      <ul>
        <% foreach(var item in viewData.MyComplexType) { %>
          <li><%= item.MyProperty %></li>
        <% } %>
      </ul>
      

      【讨论】:

      • 我需要强类型的主要原因是基础模型有一些方法将在整个master的许多地方使用。我知道我可以对 ViewData.Model 进行类型转换,但想象一个充满类型转换的页面 - 不完全是一个很好的代码。到目前为止,我只是简单地使用对象的扩展方法,所以它在无类型的 master 上“模拟”了 BaseModel 的方法。但这只是暂时的解决方案,我希望。只是认为应该有一些简单的方法来做到这一点(比如在.config中添加单行)。也许不吧。至于 ViewDataFacade - 我不确定我是否理解你的意思,如果你能详细说明......?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 2017-06-29
      相关资源
      最近更新 更多