Question

J'ai un formulaire assez complexe que je dois publier sur mon contrôleur MVC.

Voici le modèle View que je passe initialement à la vue lors de la création :

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

Voici mon avis (simplifié) :

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

Et voici ma méthode Action dans mon contrôleur :

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

Comment puis-je lier mon modèle de vue lors de sa réception sur le contrôleur ?Actuellement, lorsque je débogue, la méthode d'action reçoit un ViewModel qui ressemble à ceci :

enter image description here

Comment puis-je faire en sorte que le service et l'ID utilisateur ne soient pas nuls ?

Était-ce utile?

La solution

Notez que dans les lambdas de vos assistants, dites dans model => service.sms partie droite (service.sms) formellement n'est pas dérivé de la partie gauche (model).Cela provoque tout name les attributs des entrées résultantes soient les mêmes et vous donne des paramètres de requête auxquels vous ne vous attendiez pas.

La pratique courante consiste à utiliser for au lieu de foreach dans les cas de boucle.De cette façon, les attributs de nom pour le code HTML résultant sont générés correctement :

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

Notez que cela nécessite Model être du type mettant en œuvre IList plutôt que IEnumerable.

Mise à jour. Pour les autres valeurs, qui n'ont pas d'interface utilisateur, vous pouvez utiliser des champs masqués, afin qu'elles ne soient pas visibles pour l'utilisateur et soient néanmoins publiées sur le serveur :

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top