asp.net Опубликуйте форму с моделью представления для метода действия контроллера
-
21-12-2019 - |
Вопрос
У меня есть довольно сложная форма, которую мне нужно отправить на мой контроллер MVC.
Вот модель представления, которую я изначально передаю представлению при создании:
public class EditViewModel
{
public Service service { get; set; }
public bool sms { get; set; }
public bool email { get; set; }
public string userId { get; set; }
}
Вот мое мнение (упрощенное):
@model IList<Service_Monitor_Web_Interface.Models.ViewModels.EditViewModel>
@{
ViewBag.Title = "Configure User Notifications";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>@ViewBag.Title</h2>
@using (Html.BeginForm("Edit", "Users", FormMethod.Post, new { @class = "stdform stdform2", role = "form" }))
{
@Html.AntiForgeryToken()
<hr />
<p>
<label><u> Service:</u> </label>
<span class="field">
<u>Notification Methods:</u>
</span>
</p>
for (int i = 0; i < Model.Count; i++)
{
<p>
<label>@Model[i].service.Name</label>
<span class="field">
@Html.CheckBoxFor(model => model[i].sms)
SMS
@Html.CheckBoxFor(model => model[i].email)
Email
</span>
</p>
}
<br clear="all" /><br />
<p class="stdformbutton">
<button class="submit radius2">Save</button>
<input type="reset" class="reset radius2" value="Reset Form" />
</p>
}
А вот мой метод Action в моем контроллере:
//
// POST: /Users/Edit
[HttpPost]
public ActionResult Edit(IList<EditViewModel> viewModel)
{
return View(viewModel);
}
Как я могу связать свою модель представления при ее получении на контроллере?В настоящее время, когда я отлаживаю метод действия, он получает ViewModel, который выглядит так:
Как я могу получить, чтобы сервис и userId не были нулевыми?
Решение
Обратите внимание, что в лямбда-выражениях ваших помощников, скажем, в model => service.sms
правая часть(service.sms
) формально не выводится из левой части (model
).Это вызывает все name
атрибуты результирующих входных данных будут одинаковыми, и вы получите параметры запроса, которые вы не ожидали.
Стандартной практикой является использование for
вместо foreach
в случаях цикла.Таким образом, атрибуты имени для результирующего HTML генерируются правильно:
for(int i=0; i<Model.Count; i++)
{
<p>
<label>@Model[i].service.Name</label>
<span class="field">
@Html.CheckBoxFor(model => model[i].sms)
SMS
@Html.CheckBoxFor(model => model[i].email)
Email
</span>
</p>
}
Обратите внимание, что для этого требуется Model
быть типа реализации IList
скорее, чем IEnumerable
.
Обновлять. Для других значений, для которых нет пользовательского интерфейса, вы можете использовать скрытые поля, чтобы они не были видны пользователю и тем не менее отправлялись на сервер:
<label>@Model[i].service.Name</label>
<span class="field">
@Html.CheckBoxFor(model => model[i].sms)
SMS
@Html.CheckBoxFor(model => model[i].email)
Email
@Html.HiddenFor(mode => model[i].userId)
@Html.HiddenFor(mode => model[i].service.Name)
...other field of service you want to be posted...
</span>