Pergunta

Eu tenho um formulário bastante complexo que preciso postar no meu controlador MVC.

Aqui está o modelo de visualização que inicialmente passo para a visualização na criação:

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

Aqui está minha visão (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>
}

E aqui está o meu método Action no meu controlador:

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

Como posso vincular meu modelo de visualização ao recebê-lo no controlador?Atualmente, quando depuro, o método de ação recebe um ViewModel parecido com este:

enter image description here

Como posso fazer com que o serviço e o userId não sejam nulos?

Foi útil?

Solução

Observe que nas lambdas dos seus ajudantes, diga em model => service.sms parte direita (service.sms) formalmente não é derivado da parte esquerda (model).Isso faz com que tudo name atributos das entradas resultantes sejam iguais e fornece parâmetros de solicitação que você não esperava.

A prática padrão é usar for instalado de foreach em casos de loop.Dessa forma, os atributos de nome do HTML resultante são gerados corretamente:

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

Observe que isso requer Model ser do tipo implementando IList em vez de IEnumerable.

Atualizar. Para outros valores, que não possuem nenhuma UI para eles, você pode usar campos ocultos, para que não fiquem visíveis para o usuário e, mesmo assim, sejam postados no 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top