2012-07-11 3 views
1

Je suis nouveau dans la programmation mvc3 asp.net et j'essaye de construire un formulaire spécifique. Je dois avoir un formulaire avec le champ utilisateur (que j'ai) mais aussi une liste d'objet (dans ce cas SStatus).Liste des éléments sélectionnés et autre objet


Ma forme:

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Création d'utilisateur</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Lastname) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Lastname) 
      @Html.ValidationMessageFor(model => model.Lastname) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Firstname) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Firstname) 
      @Html.ValidationMessageFor(model => model.Firstname) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Email) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Email) 
      @Html.ValidationMessageFor(model => model.Email) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Login) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Login) 
      @Html.ValidationMessageFor(model => model.Login) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Description) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Description) 
      @Html.ValidationMessageFor(model => model.Description) 
     </div> 

     <p>Status</p> 
     @{ 

// L'erreur était ici sous forme

   @{ 
        var list = ViewBag.listStatus as List<SStatus>; 
       } 
       @if (list != null) 
       { 
        foreach(var status in list) 
        { 
         <option [email protected]>@status.Name</option> 
        } 
       } 
      </select> 
     } 

     <p> 
      <input type="submit" value="Création" /> 
     </p> 
    </fieldset> 
} 

L'appel de la liste:


public ActionResult CreateUserView() 
     { 
      RestClient client = new RestClient(Resource.Resource.LocalUrlService); 
      RestRequest request = new RestRequest("/status/all", Method.GET); 
      var response = client.Execute(request); 
      if(response.StatusCode == HttpStatusCode.OK) 
      { 
       List<SStatus> listSatus = JsonHelper.FromJson<List<SStatus>>(response.Content); 
       ViewBag.listStatus = listSatus; 
      } 
      return View(); 
     } 

et le poste de forme:


 [HttpPost] 
      public ActionResult CreateUserView(Uuser userToCreate, string list) 
      { 
//list got the ID of SStatus. 
       if (ModelState.IsValid) 
       {//Stuff} 
    } 

La question est la suivante: Comment obtenir l'élément sélectionné dans la liste?

Cordialement.

+0

Vous affichez semble être fortement typé, mais 'CreateUserView' une propriété ne remplit ViewBag. Comment le 'Uuser' est-il envoyé à la vue? –

+0

Je l'ai construit via le contrôleur (clic droit ajouter une vue). Ainsi, lorsque je soumets le formulaire, l'objet Uuser est correctement envoyé à CreateUserView (POST). – David

Répondre

1

Utilisez un modèle de modèle de vue. Je ne vois toujours pas comment votre objet Uuser est envoyé à la vue (via l'action [HttpGet] par défaut, mais je pense que je vois ce que vous essayez d'accomplir.) Si vous refactorisez de cette façon, vous aurez toujours accès à utiliser la validation intégré, modèle automagic reliure, etc.

public class CreateUserViewModel 
{ 
    public Uuser User { get; set; } 
    public string Status { get; set; } 
} 

Ensuite, votre paramètre d'action doit être de type CreateUserViewModel par exemple

[HttpPost] 
public ActionResult CreateUserView(CreateUserViewModel vm) 
{ 
    if(ModelState.IsValid) 
    { 
     {//Stuff} 
} 

Je crois que vous aurez besoin d'un attribut name sur l'élément <select> afin qu'il soit affiché.

<p>Status</p> 
    @{ 
     <select name="Status"> 

Bien que vous ayez des problèmes si le modèle n'est pas valide. Votre vue doit être fortement typée contre CreateUserViewModel par exemple.

@model YourModelNamespace.CreateUserViewModel 

Ainsi, votre propriété Lastname pourrait ressembler à ceci (notez le .User)

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Création d'utilisateur</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.User.Lastname) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.User.Lastname) 
      @Html.ValidationMessageFor(model => model.User.Lastname) 
     </div> 

Et enfin, je suppose que vous pouvez garder la liste possible de la situation dans le ViewBag, mais vous aurez envie pour définir la valeur sélectionnée sur @Model.Status. Vous pouvez envisager de remplacer CreateUserViewModel.Status par un List<SelectListItem> que vous pouvez remplir à partir de votre contrôleur, par ex. votre action GET devrait return View(CreateUserViewModel)

public ActionResult CreateUserViewModel() 
{ 
    CreateUserViewModel vm = new CreateUserViewModel(); 
    vm.User = // set user 
    vm.Status = new List<SelectListItem>() 
    { 
     new SelectListItem() 
     { 
      Value = "status1", 
      Text = "status 1", 
      Selected = false 
     }, 
     new SelectListItem() 
     { 
      Value = "status2", 
      Text = "status 2", 
      Selected = true 
     }, 
    }; 

    return View(vm); // this is the correct way to strongly type your view 
} 
+0

Thx! J'ai juste oublié de donner un nom à ma sélection.Maintenant ça marche. – David

Questions connexes