2014-11-24 4 views
0

У меня есть файлы _Layout.cshtml как частичное представление как заголовок на каждом основном представлении.MVC 4 - передавать данные через ViewBag в частичное представление _Layout

Я хотел бы определить элемент Select на _Layout и передать некоторые данные в частичный вид с помощью ViewBag, чтобы данные были заполнены в представлении и могут быть позже представлены.

Мои вопросы:

  • Где функция ActionResult определено, что содержит в себе и определяет данные в ViewBag?
  • Что делать, если я хочу отправить форму на частичный вид? Где и какое действие должно быть определено/использовано для принятия команды HttpPost?

Спасибо!

+0

'ViewBag' является свойством' ControllerBase', поэтому его доступно во всех методах контроллера. Вы можете отправлять сообщения любому методу на любом контроллере. –

+0

Но где должен быть определен ActionResult, который устанавливает данные в ViewBag? Для представления _Layout нет индекса ActionResult ... – alextc

+0

Если ваш файл макета имеет, например, '

@ViewBag.SomeProperty
', и в методе действий, который возвращает представление, которое использует этот макет, если вы добавляете' ViewBag.SomeProperty = "Некоторое значение" ', то« Некоторое значение »будет отображаться в представлении –

ответ

3

Что я предлагаю сделать базовым классом контроллера. Наследуйте все свои контроллеры от него. Код для отображения данных для макета, может лежать в его конструкторе или какой-либо другой общей функции, которую все ваши контроллеры могут использовать в качестве дочерних элементов этого базового класса.

public class BaseController : System.Web.Mvc.Controller 
{ 
    public BaseController() 
    { 
    // This code will run for all your controllers 
    ViewBag.MyData = "SomeData"; 
    } 
} 

О ваш вопрос:

Что мне делать, если я хочу, чтобы отправить форму на частичный вид? Где и какое действие должно быть определено/использовано для принятия команды HttpPost?

Вы можете просто поставить имя контроллера на форме:

@using (Html.BeginForm("ActionName", "Controller")) 
+0

отлично. Благодаря! – jonatanes

1

Есть, возможно, несколько недоразумений о том, как _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, и вам не нужно создавать список выбора в каждом действии контроллера.

Смежные вопросы