0

Je cette Voir Modèle:propriétés SelectListItem dans le modèle de vue ne sont pas repassé de la vue au contrôleur

public class UserViewModel 
{ 
    public string ID { get; set; } 

    [Required] 
    [Display(Name = "Nombre")] 
    public string Nombre { get; set; } 

    [Required] 
    [Display(Name = "Login")] 
    public string Login { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [Display(Name = "Contraseña")] 
    public string Password { get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "E-mail")] 
    public string Email { get; set; } 

    [DataType(DataType.PhoneNumber)] 
    [Display(Name = "Teléfono")] 
    public string PhoneNumber { get; set; } 

    [Display(Name = "Ciudad")] 
    public System.Web.Mvc.SelectListItem City { get; set; } 

    [Display(Name = "Empresas")] 
    public IEnumerable<System.Web.Mvc.SelectListItem> Empresas { get; set; } 

    [Required] 
    [Display(Name = "Perfil")] 
    public string Role { get; set; } 

    [Display(Name = "Está Vigente")] 
    public bool Vigente { get; set; } 
} 

le problème que j'ai est que lorsque je choisis quelque chose dans la ville et Empresas sous la forme (ils sont Les deux champs SELECT), ils ne sont pas transmises au contrôleur dans le paramètre UserViewModel:

public JsonResult EditUser(UserViewModel model) 
    { 
      ..... 
    } 

propriétés Seulement autres sont passés.

Quelle est la bonne façon de gérer cela?

EDIT:

cela fait partie de la vue:

  @using (Html.BeginForm("EditUser", "Account", new { area = "Security" }, FormMethod.Post, new { @class = "form-horizontal form-label-left", role = "form", novalidate = "novalidate", id = "frmUsuario" })) 
      { 
       var id = Model == null ? String.Empty : Model.ID; 
       <div class="errores col-md-12 col-sm-12 col-xs-12" style="display: none"> 
        <div class='validation-summary-errors alert alert-danger alert-white rounded' data-valmsg-summary="true"> 
         <div class="icon"> 
          <i class="fa fa-times-circle"></i> 
         </div> 
         <p>Debe completar los campos marcados en forma correcta.</p> 
        </div> 
       </div> 
       @Html.AntiForgeryToken(); 
       <input type="hidden" value="@id" id="id" name="id" /> 
       <div class="item col-md-12 col-sm-12 col-xs-12 form-group has-feedback"> 
        @Html.TextBoxFor(m => m.Nombre, new { @class = "form-control has-feedback-left", placeholder = "Nombre", required = "required" }) 
        <span class="fa fa-user form-control-feedback left" aria-hidden="true"></span> 
       </div> 
       <div class="item col-md-6 col-sm-6 col-xs-12 form-group has-feedback"> 
        @Html.TextBoxFor(m => m.Login, new { @class = "form-control has-feedback-left", placeholder = "Login", required = "required" }) 
        <span class="fa fa-sign-in form-control-feedback left" aria-hidden="true"></span> 
       </div> 

       <div class="item col-md-6 col-sm-6 col-xs-12 form-group has-feedback"> 
        @{ 
         //var requerido = String.IsNullOrEmpty(userId) ? "required" : String.Empty; 
         var requerido = Model == null || String.IsNullOrEmpty(Model.ID); 
         object htmlAttributes = null; 
         if (requerido) 
         { 
          htmlAttributes = new { @class = "form-control has-feedback-left", placeholder = "Contraseña", required = "required" }; 
         } 
         else 
         { 
          htmlAttributes = new { @class = "form-control has-feedback-left", placeholder = "Contraseña" }; 
         } 
        } 
        <!-- Para evitar que los password managers llenen los campos --> 
        <input type="text" id="hidUser" style="display: none" /> 
        <!-- Para evitar que los password managers llenen los campos --> 
        <input type="password" id="hidPassword" style="display: none" /> 

        @Html.PasswordFor(m => m.Password, htmlAttributes) 
        <span class="fa fa-key form-control-feedback left" aria-hidden="true"></span> 
       </div> 

       <div class="item col-md-6 col-sm-6 col-xs-12 form-group has-feedback"> 
        @Html.TextBoxFor(m => m.Email, new { @class = "form-control has-feedback-left", placeholder = "E-mail", required = "required" }) 
        <span class="fa fa-envelope form-control-feedback left" aria-hidden="true"></span> 
       </div> 

       <div class="item col-md-6 col-sm-6 col-xs-12 form-group has-feedback"> 
        @Html.TextBoxFor(m => m.PhoneNumber, new { @class = "form-control has-feedback-left", placeholder = "Teléfono" }) 
        <span class="fa fa-phone form-control-feedback left" aria-hidden="true"></span> 
       </div> 

       <div class="item col-md-12 col-sm-12 col-xs-12 form-group"> 
        @Html.DropDownListFor(m => m.City, new SelectList(new List<SelectListItem>()), new { style = "width: 100%" }) 
       </div> 

       <div class="item col-md-12 col-sm-12 col-xs-12 form-group"> 
        @Html.DropDownListFor(m => m.Role, new SelectList(new List<SelectListItem>()), new { style = "width: 100%" }) 
       </div> 

       <div class="item col-md-12 col-sm-12 col-xs-12 form-group"> 
        @Html.DropDownListFor(m => m.Empresas, new SelectList(new List<SelectListItem>()), new { style = "width: 100%", multiple = "multiple" }) 
       </div> 

       <div class="item col-md-12 col-sm-12 col-xs-12 form-group"> 
        Está Vigente 
        @Html.CheckBoxFor(m => m.Vigente, new { @class = "flat" }) 
       </div> 
      } 
+0

Pouvez-vous ajouter votre contrôleur et afficher le code pour nous aider à mieux comprendre le problème – hasan

+0

S'il vous plaît partager votre vue aussi. – Saket

+0

J'ai ajouté la partie pertinente de la vue, en montrant le formulaire. – jstuardo

Répondre

0

S'il vous plaît changer le type de Ville Propriété à UserViewModal

public string City { get; set; } 

Ensuite, il retournera la valeur de l'option sélectionnée au contrôleur pour par exemple

<select 
<option value="1">Delhi </option> 
<option value="2">Surat </option> 
</select> 

si vous sélectionnez Delhi alors il attribuer une valeur 1 à la propriété

+0

Donc, je ne devrais passer que des types simples. J'essayais de passer cet objet parce que j'utilise un plugin jQuery Select2 et avec lui, je dois également passer le texte afin de sélectionner la valeur par défaut. Je pense que je devrais obtenir le texte de la base de données au moyen d'une autre propriété ou méthode quand la vue est chargée. – jstuardo

0

Je me demande il n'y a rien montrer dans votre menu déroulant. Dans votre modèle de vue, il doit contenir au moins deux propriétés, telles que AvailableCities et City.

public List<SelectListItem> AvailableCities { get;set; } 
public string City { get;set; } 

AvailableCities contient toutes les villes qui devraient apparaître dans l'ombre. Et la Ville utilise pour obtenir la valeur de l'utilisateur sélectionné.

À votre avis,

@Html.DropDownListFor(m => m.City, Model.AvailableCities, new { @class = "form-control" }) 

Pour l'instant, vous devriez voir le menu déroulant et de shawn qui pourrait obtenir la valeur sélectionnée dans votre action.

+0

Hehehe ..... votre question est valide, cependant, il est normal que SELECT soit vide au début. Ceci est un plugin jQuery Select2, qui remplit la liste déroulante lors de l'expansion (via AJAX). Cela permet également de rechercher une ville dans la liste. Enfin, j'ai utilisé des types simples et ajouté 2 autres propriétés dans le modèle qui récupère les entités correspondantes. De cette façon, ça fonctionne comme un charme. – jstuardo