2016-11-03 2 views
0

J'ai le viewmodel suivant dans mon projet mvc.@ html.validationmessagefor ne montre pas le message d'erreur

public class AddGISViewModel 
{ 
    public myproject.Models.DomainModels.GIS gis { get; set; } 
    public IEnumerable<myproject.Models.DomainModels.Companies> Companies { get; set; } 
    public long CompanyID { get; set; } 
} 

J'ai créé une vue que cette

@model myproject.ViewModels.GIS.AddGISViewModel 
@using (Ajax.BeginForm("Create", "GIS", new AjaxOptions { HttpMethod = "Post", Url = "/GIS/Create" })) 
{ 
@Html.AntiForgeryToken() 
<div class="form-horizontal"> 
    @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
    <div class="form-group"> 
     @Html.Label("company", new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.DropDownListFor(model => model.CompanyID, new SelectList(Model.Companies, "CompanyID", "Name"), "select company please ", htmlAttributes: new {@class = "form-control" }) 
      @Html.ValidationMessageFor(model => model.CompanyID) 
     </div> 
    </div> 

aussi j'ai créé à la suite des métadonnées

[Required(ErrorMessage = "you should select company")] 
    [DisplayName("company")] 
    [Display(Name = "company")] 
    public long CompanyID { get; set; } 

Quand je lance mon projet @validationmessagefor show 'CompanyID est un champ obligatoire' non 'vous devriez sélectionner l'entreprise' que je définis dans les métadonnées. Comment puis-je résoudre ce problème?

+0

Appliquez ces attributs à la classe 'AddGISViewModel' –

+0

merci beaucoup, j'applique ces attributs à addGISViewModel et cela fonctionne. Y a-t-il un moyen au lieu de cela? –

+0

Pourquoi ne voudriez-vous pas le faire de la bonne façon? (vous avez créé un modèle de vue qui devrait représenter exactement ce dont vous avez besoin dans la vue, y compris les attributs d'affichage et de validation) –

Répondre

0

Vous avez créé un modèle de vue, appliquez ces attributs à la propriété dans le modèle de vue. Étant donné que le but d'un modèle de vue est de représenter ce que vous voulez afficher/modifier dans la vue, il est inutile de créer une classe distincte pour les métadonnées.

Votre point de vue modèle devrait être

public class AddGISViewModel 
{ 
    [Required(ErrorMessage = "you should select company")] 
    [DisplayName("company")] 
    public long? CompanyID { get; set; } 
    public IEnumerable<SelectListItem> Companies { get; set; } 
    .... 
} 

Notez que la CompanyID propriété devrait être annulable pour protéger contre le sous-affichage des attaques, et la propriété de collection pour afficher les entreprises n DropDownList devrait être IEnumerable, de sorte que la view est

@Html.DropDownListFor(model => model.CompanyID, Model.Companies, "select company please ", new { @class = "form-control" }) 

En outre, les modèles de vue ne doivent pas contenir de modèles de données si vous modifiez les propriétés de ce modèle. Si oui, remplacez GIS gis par chaque propriété de GIS dont vous avez besoin dans la vue.