asp.net Опубликуйте форму с моделью представления для метода действия контроллера

StackOverflow https://stackoverflow.com//questions/22013590

Вопрос

У меня есть довольно сложная форма, которую мне нужно отправить на мой контроллер 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 &nbsp;&nbsp;
            @Html.CheckBoxFor(model => model[i].email)
            Email &nbsp;&nbsp;
        </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, который выглядит так:

enter image description here

Как я могу получить, чтобы сервис и 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 &nbsp;&nbsp;               
            @Html.CheckBoxFor(model => model[i].email)
            Email &nbsp;&nbsp;
        </span>
    </p>
}

Обратите внимание, что для этого требуется Model быть типа реализации IList скорее, чем IEnumerable.

Обновлять. Для других значений, для которых нет пользовательского интерфейса, вы можете использовать скрытые поля, чтобы они не были видны пользователю и тем не менее отправлялись на сервер:

<label>@Model[i].service.Name</label>
<span class="field">                
    @Html.CheckBoxFor(model => model[i].sms)
    SMS &nbsp;&nbsp;               
    @Html.CheckBoxFor(model => model[i].email)
    Email &nbsp;&nbsp;
    @Html.HiddenFor(mode => model[i].userId)
    @Html.HiddenFor(mode => model[i].service.Name)
    ...other field of service you want to be posted...
</span>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top