PartialView() не возвращает представление с символом подчеркивания

Контроллер шаблонов:

это работает:

 return PartialView("_Create");

но это не работает:

return PartialView();

Соглашение asp.net mvc должно фактически проверять папку просмотра с именем контроллера => «Шаблон» и проверять наличие представления с тем же именем, что и действие => «Создать».

Это справедливо для возврата View(). Почему return PartialView() не просто учитывает подчеркивание?


person Pascal    schedule 28.04.2012    source источник


Ответы (3)


Этот ответ специально для 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;

Это с механизмом просмотра бритвы, я предполагаю, что он будет сравним с механизмом просмотра веб-форм, если это ваш выбор.

Наконец, вам нужно зарегистрировать это как механизм просмотра:

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 в других версиях.

person Chris Marisic    schedule 12.01.2016

Это всего лишь соглашение об именах, согласно которому частичные представления должны начинаться с подчеркивания. но странно, что /mvc engine не ищет частичные представления с подчеркиванием.

  1. поэтому вы должны явно указать return PartialView("_Create").
    или
  2. Нарушьте соглашение об именах, чтобы в вашем коде не было строк.
person Sundara Prabu    schedule 26.03.2013

Прочитав об этом в Интернете, мнения очень разделились относительно того, почему _ должен быть там / должен ли он быть там вообще.

Я бы сказал, что это не соглашение об именах asp.net mvc, и доказательством этого является то, что сама структура не придерживается этого. (как вы указали в своем вопросе)

Происхождение _ происходит от webmatrix/asp.net, где _ используется для ресурсов, которые не доступны пользователю напрямую.

Единственное, к чему может добавить префикс, — это представления, которые являются повторно используемыми компонентами, такими как _layout и, возможно, _nav или _datepicker.

Razor в любом случае удалил концепцию частичных представлений (поскольку нет разницы, подобной той, что между .aspx и .ascx, в razor это все . cshtml в любом случае).

person Michiel Cornille    schedule 20.04.2016
comment
если вы используете _Foo.cshtml и просто возвращаете PartialView(mydata); он не находит его, если ваше действие вызывает метод Foo() в контроллере. Но с помощью return PartialView(_Foo, mydata); он может найти его. - person juFo; 09.03.2018