Как asp.net mvc связывает представление с действием контроллера?
Я открыл образец проекта ASP.NET MVC.
В HomeController
Я создал метод (действие) с именем MethodA
public ActionResult MethodA()
{
return View();
}
Я щелкнул правой кнопкой мыши по MethodA
и создал новое представление под названием MethodA1
Повторно сделал это и создал новое представление под названием MethodA2
.
-
Как это волшебное отношение сделано? Я искал конфигурацию, чтобы сообщить компилятору, что представления MethodAX
связаны с действием MethodA
, но не найдены.
-
Какое представление будет возвращено контроллером при вызове MethodA
?
Ответы
Ответ 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. Вы должны увидеть, что он работает.