2016-12-04 4 views
1

Ich habe Validationmessage für das Feld Role in der ViewModel festgelegt. Die dropdownlist spiegelt angeblich das Role Feld in der ViewModel wider. Wenn ich jedoch keine Werte aus der dropdownlist auswählte, zeigt es überhaupt keinen Fehler an, obwohl ich die Required Validierung für dieses Feld bereits festgelegt habe .. eine Idee warum?ASP.NET MVC ValidationMessage nicht für Dropdown-Liste

Das Ansichtsmodell:

public class RegisterViewModel 
{ 
    [Required] 
    [EmailAddress] 
    [Display(Name = "Email")] 
    public string Email { get; set; } 

    [Required] 
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 
    public string ConfirmPassword { get; set; } 

    [Required(ErrorMessage = "Please select a user type")] 
    [Display(Name = "Select user type:")] 
    public string Role { get; set; } 
} 

The View:

<div class="form-group"> 
    @Html.LabelFor(m => m.Role, new { @class = "col-md-2 control-label"}) 
    <div class="col-md-10"> 
     @Html.DropDownList("Role", null, "Select user type", new { @class = "form-control" }) 
     @Html.ValidationMessage("Role") 
    </div> 
</div> 
+0

Hat Ihre Anfrage die Aktion des Controllers beeinflusst und können Sie den Zustand Ihres Modells überprüfen? – kat1330

Antwort

1

Sie können keine Client-seitige Validierung erhalten, wenn Sie eine Überlastung von DropDownList() verwenden, wenn der erste Parameter IEnumerable<SelectListItem> (dh, wenn Verwenden Sie den gleichen Namen für die SelectList als die Eigenschaft Ihre Bindung an). Wenn Sie den HTML-Code überprüfen, den Sie generieren, werden Sie feststellen, dass keine data-val-* Attribute für das Element <select> generiert werden.

Es würde zu verwenden, wenn Sie verwenden waren (sagen wir)

ViewBag.RoleList = new SelectList(...); 

in der Steuerung und

@Html.DropDownList("Role", (IEnumerable<SelectListItem>),ViewBag.RoleList "Select user type", new { @class = "form-control" }) 

in der Ansicht, aber da Sie ein Ansichtsmodell (was best practice ist), dann eine Eigenschaft für die SelectList zum Modell

public class RegisterViewModel 
{ 
    .... 
    [Required(ErrorMessage = "Please select a user type")] 
    [Display(Name = "Select user type:")] 
    public string Role { get; set; } 
    public IEnumerable<SelectListItem> RoleList { get; set; } 
} 

und in dem GET Meth hinzufügen od, bevölkern die Sammlung, bevor Sie das Modell der Ansicht

RegisterViewModel model = new RegisterViewModel() 
{ 
    RoleList = .... // your query to generate the SelectList 
}; 
return View(model); 

und in der Ansicht, verwenden Sie die stark HtmlHelper Methoden

@Html.DropDownListFor(m => m.Role, Model.RoleList "Select user type", new { @class = "form-control" }) 
@Html.ValidationMessageFor(m => m.Role) 

auch Siehe this DotNetFiddle getippt geben für weitere Beispiele, warum die Eigenschaft Ihre Bindung zu und der Name der ViewBag für die SelectList sollte nicht gleich sein.

+0

Ich habe Ihre Idee, aber ich weiß nicht, wie die '' IEnumerable RoleList'' aus einem Db-Kontext zu füllen. Jede Hilfe wird geschätzt! – Pow4Pow5

+0

Ok, ich habe das Problem bereits gelöst! Vielen Dank für Ihre Antwort! – Pow4Pow5

Verwandte Themen