Подтвердить что ты не робот

Как asp.net mvc связывает представление с действием контроллера?

Я открыл образец проекта ASP.NET MVC.

В HomeController Я создал метод (действие) с именем MethodA

public ActionResult MethodA()
{
    return View();
}

Я щелкнул правой кнопкой мыши по MethodA и создал новое представление под названием MethodA1

Повторно сделал это и создал новое представление под названием MethodA2.

  • Как это волшебное отношение сделано? Я искал конфигурацию, чтобы сообщить компилятору, что представления MethodAX связаны с действием MethodA, но не найдены.

  • Какое представление будет возвращено контроллером при вызове MethodA?

4b9b3361

Ответ 1

Соглашение состоит в том, что если вы не укажете имя представления, соответствующее представление будет именем действия. Итак:

public ActionResult MethodA()
{
    return View();
}

отобразит ~/Views/ControllerName/MethodA.cshtml.

Но вы также можете указать имя вида:

public ActionResult MethodA()
{
    return View("FooBar");
}

и теперь будет отображаться представление ~/Views/ControllerName/FooBar.cshtml.

Или вы даже можете указать полное имя вида, которое не находится в папке представлений текущего контроллера:

public ActionResult MethodA()
{
    return View("~/Views/Foo/Baz.cshtml");
}

Теперь очевидно, что все это предполагает, что Razor - это механизм просмотра. Если вы используете WebForms, замените .cshtml на .aspx или .ascx (если вы работаете с частичными).

Например, если нет представления, он даже скажет вам, где и в каком порядке ищет представления:

enter image description here

Помните: ASP.NET MVC - это соглашение о конфигурации.

Ответ 2

Схема использования MVC использует конфигурацию. Структура вызывает ExecuteResult для объекта ViewResult (созданного возвратом View();). Затем среда по соглашениям выглядит в нескольких местах, чтобы найти представление

Если вы используете области, инфраструктура будет выглядеть в следующих местах для просмотра.

  • /Areas//Views/ControllerName/ViewName.aspx
  • /Areas//Views/ControllerName/ViewName.ascx
  • /Areas//Views/Shared/ViewName.aspx
  • /Areas//Views/Shared/ViewName.ascx
  • /Areas//Views/ControllerName/ViewName.cshtml
  • /Areas//Views/ControllerName/ViewName.vbhtml
  • /Areas//Views/Shared/ViewName.cshtml
  • /Areas//Views/Shared/ViewName.vbhtml

Без областей (или если вы используете области и не найдено ни одного вида), структура будет выглядеть в следующих местах

  • /Views/ControllerName/ViewName.aspx
  • /Views/ControllerName/ViewName.ascx
  • /Views/Shared/ViewName.aspx
  • /Views/Shared/ViewName.ascx
  • /Views/ControllerName/ViewName.cshtml
  • /Views/ControllerName/ViewName.vbhtml
  • /Views/Shared/ViewName.cshtml
  • /Views/Shared/ViewName.vbhtml

Как только Framework проверяет местоположение и находит файл, поиск останавливается, и найденное представление используется для отображения ответа клиенту.

Существует ряд переопределенных версий метода View. Наиболее распространенным является предоставление определенного представления, вне рамочного соглашения, путем вызова его по имени. Например

return View("~/Views/AnotherIndex.cshtml");

Как интересная сноска, структура ищет устаревшие представления ASP, С# и VB Razor (aspx, ascx, cshtml и vbhtml), хотя у вас есть определенный механизм просмотра.

Ответ 3

Я искал то же самое, и я только что сделал пару тестов и понял. Это нигде не спасает. Чтобы понять, как это работает; просто выполните следующие действия:

В вашем контроллере щелкните правой кнопкой мыши, Добавить вид Затем введите другое имя вида и Ctrl F5 вы получите ошибку сервера в приложении.

Например, если вы щелкнете правой кнопкой мыши, добавьте View в следующем методе действия индекса и введите "Index2" в поле "Вид", вы получите сообщение об ошибке.

public class TestController : Controller
{
    // GET: Test
    public ActionResult Index()
    {
        return View();
    }
}

Итак, в основном существует соответствие 1-1 между именем действия и именем вида. И вы не можете добавить представление для того же метода, поэтому нет необходимости сохранять в конфигурационном файле.

Теперь измените имя файла вида в Visual Studio с Index2.cshtml на Index.cshtml, затем Ctrl + F5. Вы должны увидеть, что он работает.