Как ASP.Net MVC определяет представление для использования с контроллера?

У меня есть контроллер, который возвращает ActionResult. В частности, он вызывает return View(someViewModel) в конце метода. Вот сигнатура метода:

protected ActionResult SomeControllerMethod(AViewModel someViewModel)

Впоследствии я унаследовал от AViewModel (AnInheritedViewModel), добавил несколько новых свойств в класс и теперь передаю его в SomeControllerMethod.

Теперь в операторе return в конце этого метода я получаю сообщение об ошибке о том, что представление не может быть найдено. Это достаточно справедливо, но я не уверен, как все это работает по умолчанию.

Имена представлений, которые MVC сообщает мне, не совпадают ни с именем метода контроллера, ни с типом модели. По той же схеме нет и видов, соответствующих названию исходной модели. Поэтому я не уверен, как MVC решает, какое представление он будет использовать?


person larryq    schedule 14.12.2012    source источник


Ответы (3)


Когда ты

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

MVC пытается найти представление с именем SomeControllerMethod.cshtml. Он использует имя метода в качестве руководства для поиска файла представления.

Вы можете переопределить это:

public ActionResult SomeControllerMethod()
{
    return View("MyView");
}

и поэтому MVC попытается найти «MyView.cshtml».

person Jason Evans    schedule 14.12.2012
comment
Разве это не отправит строку «MyView» в качестве модели в SomeControllerMethod.cshtml? - person Kaizen Programmer; 14.12.2012
comment
Чтобы отправить модель, вы должны использовать: return View("MyView", myModelClass); - person Jason Evans; 14.12.2012
comment
Спасибо, Джейсон (и все остальные). Что, если (как в моем случае) вызов относится к View(model) — использует ли MVC тип класса модели для определения искомого представления? - person larryq; 14.12.2012
comment
Если метод действия называется Index и вы вызываете return View(model), то MVC будет искать представление с именем Index.cshtml и передавать ему model. - person Jason Evans; 14.12.2012

Также обязательно следите за представлениями, которые находятся в /Views/Shared (MVC также будет искать эту папку по умолчанию). Но больше всего раздражает, когда метод действия переименовывается с помощью ActionNameAttribute, например:

[ActionName("Bob")]
public ActionResult MyMethod()
{
    return View();
}

В этом случае MVC будет искать представление под названием «Боб».

person Adrian Thompson Phillips    schedule 14.12.2012

Когда пользователь вводит URL-адрес в браузер, приложение MVC использует правила маршрутизации, определенные в файле Global.asax, для анализа URL-адреса и определения пути к контроллеру. Затем контроллер определяет соответствующий метод действия для обработки запроса. По умолчанию URL-адрес запроса рассматривается как дополнительный путь, который включает имя контроллера, за которым следует имя действия. Например, если пользователь вводит URL-адрес http://contoso.com/MyWebSite/Products/Categories, подпуть — /Products/Categories. Правило маршрутизации по умолчанию рассматривает «Продукты» как префикс имени контроллера, который должен заканчиваться на «Контроллер» (например, «Продуктсконтроллер»). Он рассматривает «Категории» как имя действия. Поэтому правило маршрутизации вызывает метод Categories контроллера Products для обработки запроса. Если URL-адрес заканчивается на /Products/Detail/5, правило маршрутизации по умолчанию рассматривает "Detail" как имя действия, и для обработки запроса вызывается метод Detail контроллера продуктов. По умолчанию значение «5» в URL-адресе будет передано в метод Detail в качестве параметра. В следующем примере показан класс контроллера с методом действия HelloWorld.

public class MyController : Controller
{
    public ActionResult HelloWorld()
    {
        ViewData["Message"] = "Hello World!";
        return View();
    }
}

Ссылка: http://msdn.microsoft.com/en-us/library/dd410269(v=vs.98).aspx

person MUG4N    schedule 14.12.2012