4

我刚刚被一个问题所困扰,我有一个视图 (FindUser.aspx) 试图呈现部分视图 (FindUser.ascx)。视图的默认搜索路径会在各种文件夹中查找以视图命名的文件。相当令人惊讶的是,对于视图,它会查找扩展名为 .aspx 或 .ascx 的文件。部分视图使用相同的列表。

因为我得到了两个同名文件,所以视图分辨率反复先找到页面,陷入死循环。

我知道我可以通过调用视图和局部视图的不同名称来解决此问题,或者将我的搜索位置更改为仅用于视图的 .aspx 和仅用于局部视图的 .ascx。

我的问题是为什么 MVC 默认同时查看这两个扩展?视图 == 页面 == .aspx 和部分视图 == 控件 == .ascx 似乎更有意义。那为什么要把水搅浑呢?

4

6 回答 6

3

因为偏或不偏,一个视图仍然是一个视图。拥有 FindUser.aspx 和 FindUser.ascx 与拥有两个同名的常规视图相同。

于 2009-04-28T14:36:39.017 回答
2

我认为避免您遇到的问题的方法是使用不同的视图名称。您可能不应该有两个文件名仅在扩展名上不同的视图。但是,如果您真的想要一个严格的 Page = View, Control = Partial 映射,只需通过从 WebFormViewEngine 继承来创建自己的 ViewEngine 并更改视图位置格式:

public class MyWebFormViewEngine : WebFormViewEngine {
    public MyWebFormViewEngine() {
        base.ViewLocationFormats 
          = new string[] {"~/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx" };
        base.PartialViewLocationFormats 
          = new string[] { "~/Views/{1}/{0}.ascx", "~/Views/Shared/{0}.ascx" };
    }
}

然后在 Application_Start() 中将其配置为您的视图引擎:

// Call this method during Application_Start to setup your view engine
internal static void SetupViewEngines() {
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new MyWebFormViewEngine());
}
于 2009-04-28T15:53:54.730 回答
1

您可以在渲染视图时为 MVC 提供直接路径。假设我的Foo.aspx文件Home夹中有一个,Foo.ascxShared. 在您的操作方法中,您可以执行以下任一操作:

return View("~/Views/Shared/Foo.ascx"); // or
return View("~/Views/Home/Foo.aspx");

它会得到你正在寻找的合适的人。

于 2009-04-28T15:53:46.443 回答
1

值得我将“Control”附加到我所有的 .ascx ViewUserControls 的名称中。所以我会有FindUser.aspxFindUserControl.ascx。不能解决问题,但可以通过避免命名冲突来帮助您避免它。

于 2009-04-28T14:38:43.770 回答
0

如果您使用的是区域,则必须在构造函数中添加额外的 LocationFormats:

public class ExtensionBasedWebFormViewEngine : WebFormViewEngine
{
  public ExtensionBasedWebFormViewEngine()
  {
     ViewLocationFormats = new[] {"~/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx"};
     AreaViewLocationFormats = new[] {"~/Areas/{2}/Views/{1}/{0}.aspx", "~/Areas/{2}/Views/Shared/{0}.aspx"};

     PartialViewLocationFormats = new[] {"~/Views/{1}/{0}.ascx", "~/Views/Shared/{0}.ascx"};
     AreaPartialViewLocationFormats = new[] { "~/Areas/{2}/Views/{1}/{0}.ascx", "~/Areas/{2}/Views/Shared/{0}.ascx" };
  }
}
于 2010-07-14T15:18:17.100 回答
0

原因
视图 == ASP.NET MVC 中的 UserControl。

修复
使用不同的名称。

提示
使用下划线前缀命名用户控件的常见约定。

于 2009-04-29T08:20:35.543 回答