Есть, возможно, несколько недоразумений о том, как _layout.cshmtl и частичные работы:
_layout.cshtml не является частичным представлением. Это шаблон макета, используемый всеми вашими страницами. Это своего рода «внешняя» страница. Он автоматически применяется (за исключением случаев, когда вы установили Layout = null
). Частичный вид, в свою очередь, является «внутренней» страницей. Вы вызываете это явно со своей страницы, используя @Html.Partial
.
Даже если ваша страница визуализируется несколькими видами - фактический вид, макет, возможно, некоторые частичные виды - это все равно результат действия одного контроллера. (За исключением случаев, когда вы используете @Html.Action
для частичного «действия»). Кроме того, отображаемая страница представляет собой одну HTML-страницу, то есть любые формы на странице представляют собой просто HTML-формы.
Таким образом, ответ на вопрос «где функция ActionResult определены» является:. В действии, которое вы хотите, чтобы ваша страница будет оказана за *
Ответ на «Какие действия должны быть использованы для принять команду HttpPost "такая же, как если бы форма была на вашей странице: вы можете определить произвольное действие на произвольном контроллере для получения формы.Вам просто нужно обратиться к этому действию, когда вы оказываете форму:
@using (Html.BeginForm("action", "controller")) { ... }
*) Если вы хотите, чтобы предотвратить того, чтобы построить список выбора в каждом и каждое действие контроллера, который опирается на _layout, вы могли предположительно используйте @Html.Action
. То есть вы определяете «частичное действие», которое является не чем иным, как действием контроллера, которое возвращает PartialView()
и частичным представлением, чтобы отобразить модель из этого действия. Затем вы можете использовать это частичное действие для создания списка выбора.
Однако, прочитав некоторые новости об ASP.NET vNext, частичные действия, похоже, не очень нравятся сообществу, а в vNext будет другой способ добиться того же.
Тем не менее, если вы хотите идти по этому пути это позволяет отделить логику для выпадающего списка (язык меню пользователя?) От других ваших действий и взглядов:
class UserController
{
PartialViewResult UserMenuDropdown()
{
return PartialView(BuildUserMenuFrom(.....));
}
[Post]
ActionResult PostUserMenu()
{
// do whatever you want once the form is posted
}
}
В вашем _layout вы называете парциальное действие:
@Html.Partial("UserMenuDropdown", "User")
И в представлении для UserMenuDropdown вы предоставляете форму:
@using (Html.BeginForm("PostUserMenu"))
{
@Html.DropDownListFor(m => m.UserMenuSelectList)
}
Таким образом, выпадающий список становится «членом первого класса» с собственным действием контроллера, основным видом и моделью. Для этого вам не нужен ViewBag, и вам не нужно создавать список выбора в каждом действии контроллера.
'ViewBag' является свойством' ControllerBase', поэтому его доступно во всех методах контроллера. Вы можете отправлять сообщения любому методу на любом контроллере. –
Но где должен быть определен ActionResult, который устанавливает данные в ViewBag? Для представления _Layout нет индекса ActionResult ... – alextc
Если ваш файл макета имеет, например, '