Pregunta

Tengo un formulario bastante complejo que necesito publicar en mi controlador MVC.

Aquí está el modelo de Vista que inicialmente paso a la vista en la creación:

public class EditViewModel
{
    public Service service { get; set; }
    public bool sms { get; set; }
    public bool email { get; set; }
    public string userId { get; set; }
}

Aquí está mi vista (simplificada):

@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>
}

Y aquí está mi método de acción en mi controlador:

    //
    // POST: /Users/Edit
    [HttpPost]
    public ActionResult Edit(IList<EditViewModel> viewModel)
    {
        return View(viewModel);
    }

¿Cómo puedo vincular mi modelo de vista cuando lo recibo en el controlador?Actualmente, cuando depuro el método de acción, recibo un ViewModel que se ve así:

enter image description here

¿Cómo puedo hacer que el servicio y el ID de usuario no sean nulos?

¿Fue útil?

Solución

Tenga en cuenta que en las lambdas de sus ayudantes, diga en model => service.sms parte derecha (service.sms) formalmente no se deriva de la parte izquierda (model).Eso causa que todo name los atributos de las entradas resultantes sean los mismos y le proporciona parámetros de solicitud que no esperaba.

La práctica estándar es utilizar for instalado de foreach en casos de bucle.De esa manera los atributos de nombre para el html resultante se generan correctamente:

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>
}

Tenga en cuenta que esto requiere Model ser de tipo implementando IList en vez de IEnumerable.

Actualizar. Para otros valores, que no tienen ninguna interfaz de usuario, puede usar campos ocultos, de modo que no sean visibles para el usuario y, no obstante, se publiquen en el servidor:

<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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top