模板控制器:
这有效:
return PartialView("_Create");
但这不起作用:
return PartialView();
asp.net mvc 约定实际上应该检查具有控制器名称=>“模板”的视图文件夹,并检查与操作名称相同的视图=>“创建”。
这对于返回 View() 有效。为什么 return PartialView() 不只考虑下划线?
模板控制器:
这有效:
return PartialView("_Create");
但这不起作用:
return PartialView();
asp.net mvc 约定实际上应该检查具有控制器名称=>“模板”的视图文件夹,并检查与操作名称相同的视图=>“创建”。
这对于返回 View() 有效。为什么 return PartialView() 不只考虑下划线?
这个答案专门针对 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 一起使用。
局部视图应该以下划线开头只是一个命名约定。但奇怪的是 /mvc 引擎不会搜索带有下划线的部分视图。
return PartialView("_Create")
。在网上阅读完这篇文章后,对于为什么 _ 应该存在/是否应该存在,意见分歧很大。
我认为这不是 asp.net mvc 命名约定,并且证明框架本身并不遵守这一点。(正如您在问题中指出的那样)
_ 的来源来自 webmatrix/asp.net,其中 _ 用于不能直接提供给用户的资源。
唯一可以添加前缀的是可重用组件的视图,例如 _layout,可能还有 _nav 或 _datepicker
Razor 无论如何都删除了部分视图的概念(因为与.aspx和.ascx之间没有类似的区别,在 razor 中,无论如何都是.cshtml)。