为什么MVC会为完整视图和部分视图寻找.aspx和.ascx?

时间:2009-04-28 14:30:42

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

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

因为我的两个文件名相同,所以视图分辨率首先重复查找页面,然后进入无限循环。

我知道我可以通过调用视图和部分视图不同的名称来解决这个问题,或者只将视频位置更改为.aspx仅用于视图,而.ascx仅用于部分视图。

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

6 个答案:

答案 0 :(得分:3)

因为部分与否,视图仍然是视图。使用FindUser.aspx和FindUser.ascx与使用两个具有相同名称的常规视图相同。

答案 1 :(得分: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()中将其配置为View Engine:

// Call this method during Application_Start to setup your view engine
internal static void SetupViewEngines() {
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new MyWebFormViewEngine());
}

答案 2 :(得分:1)

为了我的价值,我将“Control”附加到我所有的.ascx ViewUserControls的名称上。所以我会FindUser.aspxFindUserControl.ascx。没有解决问题,但它可以避免命名冲突,从而避免它。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

<强>原因
在ASP.NET MVC中查看== UserControl。

<强>修正
使用不同的名称。

提示
将usercontrols命名为下划线前缀是常见的惯例。

答案 5 :(得分:0)

如果您正在使用区域,则必须在构造函数中添加其他位置格式:

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" };
  }
}