Как asp.net mvc связывает представление с действием контроллера? - PullRequest
40 голосов
/ 28 марта 2012

Я открыл пример проекта ASP.NET MVC.

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

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

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

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

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

  2. Какой вид выдаст контроллер при вызове MethodA?

Ответы [ 4 ]

56 голосов
/ 28 марта 2012

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

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 - это соглашение о конфигурации.

11 голосов
/ 28 марта 2012

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

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

  • / Areas // Views / ControllerName / ViewName.aspx
  • / Areas // Views / ControllerName / ViewName.ascx
  • / пространства // Views / Shared / ViewName.aspx
  • / пространства // Views / Shared / ViewName.ascx
  • / Areas // Views / ControllerName / ViewName.cshtml
  • / Areas // Views / ControllerName / ViewName.vbhtml
  • / пространства // Views / Shared / ViewName.cshtml
  • / пространства // 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, C # и VB Razor (aspx, ascx, cshtml и vbhtml), даже если у вас есть определенный механизм просмотра.

0 голосов
/ 18 июля 2018

В контроллере MVC действие не обязательно для просмотра. Он использует механизм делегата для захвата представления.

Связывание моделей (картографирование)

0 голосов
/ 21 марта 2017

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...