5

模板控制器:

这有效:

 return PartialView("_Create");

但这不起作用:

return PartialView();

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

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

4

3 回答 3

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 一起使用。

于 2016-01-12T23:18:38.493 回答
3

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

  1. 所以你必须明确地说return PartialView("_Create")
    或者
  2. 打破命名约定,使您的代码中没有字符串。
于 2013-03-26T19:31:40.050 回答
0

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

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

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

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

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

于 2016-04-20T12:24:45.310 回答