部分视图()不返回带下划线的视图

时间:2012-04-28 21:51:18

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

TemplateController:

这有效:

 return PartialView("_Create");

但这不起作用:

return PartialView();

asp.net mvc约定实际应该检查一个View文件夹,其名称为controller => “模板”并检查查看与action =>相同的名称“创建”。

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

3 个答案:

答案 0 :(得分:5)

这个答案专门针对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;

这是剃刀视图引擎,我认为如果它是您选择的引擎,它将与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用于其他版本。

答案 1 :(得分:3)

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

  1. 因此您必须明确说出return PartialView("_Create")
  2. 打破命名约定,以便你的代码中没有字符串。

答案 2 :(得分:0)

在网上阅读完之后,对于为什么_应该在那里/它应该在那里的意见非常分歧。

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

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

唯一可以可以作为前缀的视图是可重复使用的组件,例如_layout,也许是_nav或_datepicker

Razor无论如何都删除了局部视图的概念(因为没有类似于 .aspx .ascx之间的差异,在剃刀中&#39 ;无论如何都是 .cshtml