У меня есть представление, которое вызывает дочернее действие:
@Html.Action("RenderPostMessage", "JobSurface")
Контроллер выглядит так:
public ActionResult RenderPostMessage()
{
PostMessageViewModel postMessageViewModel = new PostMessageViewModel();
return PartialView("PostMessage", postMessageViewModel);
}
Частично это вызывает следующее:
@model PostMessageViewModel
@{
Html.EnableClientValidation(true);
Html.EnableUnobtrusiveJavaScript(true);
}
@using (Html.BeginUmbracoForm<JobSurfaceController>("HandlePostMessage", new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<p>
@Html.EditorFor(model => model.Message)
@Html.ValidationMessageFor(model => model.Message)
</p>
<p>
@Html.LabelFor(model => model.File)
@Html.TextBoxFor(x => x.File, new { type = "file" })
</p>
<p><button class="button">Post Message</button></p>
}
Контроллер сообщения "сообщение сообщения" выглядит следующим образом:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult HandlePostMessage(PostMessageViewModel model)
{
// Some logic
}
У меня есть куча переменных в представлении, что мне нужно как-то перейти к форме (возможно, как скрытые поля ввода?), Но хотя я знаю, как создавать скрытые входы на частичном, я понятия не имею, как их заполнять значения из представления.
Может ли кто-нибудь предложить, как получить значение, переданное контроллеру?
Большое спасибо.
У меня есть куча переменных в представлении, что мне нужно как-то перейти к форме (возможно, как скрытые поля ввода?)
Это просто, если вы хотите отобразить скрытое поле ввода со значением, а затем добавить его в объект ViewBag
в представлении.
Например, если вы хотите добавить содержимое переменной в форму, то в представлении вы выполните следующее:
ViewBag.Foo = "Some Value";
Затем в файле cshtml вы добавляете скрытое поле:
@Html.Hidden("Foo")
Таким образом, вы получите значение в сообщении формы.
EDIT: так выглядит ваш код.
public ActionResult RenderPostMessage()
{
PostMessageViewModel postMessageViewModel = new PostMessageViewModel();
// here you set as many values as you want to receive in the form post.
ViewBag.SomeField = "Some Value";
return PartialView("PostMessage", postMessageViewModel);
}
Посмотреть
@model PostMessageViewModel
@{
Html.EnableClientValidation(true);
Html.EnableUnobtrusiveJavaScript(true);
}
@using (Html.BeginUmbracoForm<JobSurfaceController>("HandlePostMessage", new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@Html.Hidden("SomeField")
<p>
@Html.EditorFor(model => model.Message)
@Html.ValidationMessageFor(model => model.Message)
</p>
<p>
@Html.LabelFor(model => model.File)
@Html.TextBoxFor(x => x.File, new { type = "file" })
</p>
<p><button class="button">Post Message</button></p>
}
@Html.Action
имеет параметр 'routeValues', который является анонимным объектом. Вы можете передавать значения там. Итак... от взгляда к действию:
@Html.Action("RenderPostMessage", routeValues:new{SurfaceType = "JobSurface", OtherValue = "Something", NewValue = "Something else"});
Действие принимает эти значения маршрута в качестве параметров метода:
public ActionResult RenderPostMessage(string surfaceType, string otherValue, string newValue)
{
var viewModel = new PostMessageViewModel();
viewModel.SurfaceType = surfaceType;
viewModel.OtherValue = otherValue;
viewModel.NewValue = newValue;
return PartialView("PostMessage", viewModel);
}
Готово!
name="Foo"
, но он не содержит значения (когда я просматриваю инструменты браузера dev). Должно ли это? Как только я знаю наверняка, я могу двигаться вперед, пытаясь получить значение в коде и использовать его.Viewbag
. Вам нужно установить желаемое значение в скрытом поле.