【问题标题】:PartialView() does not return a View with a underscorePartialView() 不返回带下划线的视图
【发布时间】:2012-05-09 05:14:13
【问题描述】:

模板控制器:

这行得通:

 return PartialView("_Create");

但这不起作用:

return PartialView();

asp.net mvc 约定实际上应该检查具有控制器名称的视图文件夹 =>“模板”,并检查与操作名称相同的视图 =>“创建”。

这对于返回 View() 有效。为什么返回 PartialView() 不只考虑下划线?

【问题讨论】:

    标签: asp.net-mvc-4 asp.net-mvc-partialview


    【解决方案1】:

    此答案专门针对 ASP.NET MVC5。它可能需要稍作修改才能与其他版本的 MVC 一起使用,但它通常应该适用。

    要让return Partial(model) 尊重部分名称的下划线,您需要一个自定义视图引擎。幸运的是,这是一个非常简单的自定义视图引擎。

    public class CustomRazorViewEngine : RazorViewEngine
    {
        public CustomRazorViewEngine()
        {
          var underScored = new[] { "~/Views/{1}/_{0}.cshtml", "~/Views/{1}/_{0}.vbhtml" }
    
          PartialViewLocationFormats = underScored.Union(PartialViewLocationFormats).ToArray();
        }
    }
    

    以下格式是共享视图的默认模式:

    ~/Views/Shared/{0}.cshtml
    ~/Views/Shared/{0}.vbhtml
    

    如果您愿意,您也可以包括这些替代品。如果您特别想只提供带有下划线的文件,请删除联合并仅使用:PartialViewLocationFormats = underScored;

    这是 razor 视图引擎,我认为如果您选择引擎,它可以与 webforms 视图引擎相媲美。

    最后,您需要将其注册为视图引擎:

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            //View Engines
            ViewEngines.Engines.Remove(ViewEngines.Engines.Single(x => x is RazorViewEngine));
            ViewEngines.Engines.Add(new CustomRazorViewEngine());
    

    Startup 类特定于 MVC5,这在版本之间会略有不同。您可以将 App_Start 文件与 webactivator 或其他版本的 global.asax 一起使用。

    【讨论】:

      【解决方案2】:

      局部视图应该以下划线开头只是一个命名约定。 但奇怪的是 /mvc 引擎不会搜索带有下划线的部分视图。

      1. 所以你必须明确地说return PartialView("_Create")
      2. 打破命名约定,以免代码中包含字符串。

      【讨论】:

        【解决方案3】:

        在网上阅读了这篇文章后,对于为什么 _ 应该存在/是否应该存在,意见分歧很大。

        我认为这不是一个 asp.net mvc 命名约定,证明框架本身并不遵守这一点。 (正如您在问题中指出的那样)

        _ 的来源来自 webmatrix/asp.net,其中 _ 用于不能直接提供给用户的资源。

        可以添加前缀的只有视图是可重用组件,例如 _layout,也可能是 _nav 或 _datepicker

        Razor 无论如何都删除了部分视图的概念(因为在 .aspx.ascx 之间没有类似的区别, 在 razor 中都是 .cshtml)。

        【讨论】:

        • 如果你使用 "_Foo.cshtml" 并且只返回 PartialView(mydata);如果您的操作调用控制器中的 Foo() 方法,它不会找到它。但是通过使用 return PartialView("_Foo", mydata);它可以找到它。
        猜你喜欢
        • 2016-03-25
        • 2014-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-01
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多