Почему MVC ищет .aspx и .ascx для полного и частичного просмотра? - PullRequest
4 голосов
/ 28 апреля 2009

Меня только что укусила проблема, когда у меня есть представление (FindUser.aspx), пытающееся отобразить частичное представление (FindUser.ascx). Пути поиска по умолчанию для представлений ищут файл с именем в соответствии с представлением в различных папках. Довольно удивительно, что для просмотра он ищет файл с расширениями .aspx или .ascx. И частичные представления используют тот же список.

Поскольку у меня два файла с одинаковыми именами, разрешение при просмотре неоднократно сначала находит страницу и попадает в бесконечный цикл.

Я знаю, что могу исправить это, вызвав разные имена и представления для частичного просмотра, или изменив мои местоположения поиска на .aspx только для представлений и только .ascx для частичных представлений.

Мой вопрос: почему MVC по умолчанию смотрит на оба расширения? Кажется более логичным, что представление == страница == .aspx и частичное представление == элемент управления == .ascx. Так почему мутная вода?

Ответы [ 6 ]

3 голосов
/ 28 апреля 2009

Поскольку частичное или нет, представление все еще является представлением. Иметь FindUser.aspx и FindUser.ascx - это то же самое, что иметь два обычных представления с одинаковым именем.

2 голосов
/ 28 апреля 2009

Я думаю, что способ избежать вашей проблемы - использовать разные имена представлений. У вас, вероятно, не должно быть двух представлений, имя файла которых отличается только расширением. Однако, если вы действительно хотите строгое сопоставление Page = View, Control = Partial, просто создайте свой собственный ViewEngine, унаследовав его от WebFormViewEngine, и измените форматы расположения вида:

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

Затем настройте его как ваш View Engine в 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());
}
1 голос
/ 28 апреля 2009

Вы можете указать MVC прямой путь при рендеринге Views. Скажем, у меня есть Foo.aspx в моей папке Home и частичное представление Foo.ascx в Shared. В вашем методе действия вы можете сделать:

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

И он получит нужный вам.

1 голос
/ 28 апреля 2009

Для чего стоит добавить «Control» к имени всех моих .ascx ViewUserControls. Так что у меня будет FindUser.aspx и FindUserControl.ascx. Не решает проблему, но помогает избежать ее, избегая конфликтов имен.

0 голосов
/ 14 июля 2010

Если вы используете Области, вам придется добавить дополнительные 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" };
  }
}
0 голосов
/ 29 апреля 2009

Причина
Просмотр == UserControl в ASP.NET MVC.

Fix
Используйте разные имена.

Подсказка
Общепринято называть пользовательские элементы управления префиксом подчеркивания.

...