问题
I'm trying to make a registration page in my web application. However, the validation on my form is not working. For example I have my password minimum length be 4 charterers but if I enter a blank password it still makes the POST request. How do I tell the form that the model is not valid and that they should change their password,email, etc?
AccountController.cs
[HttpPost]
public ActionResult Register(RegisterModel model){
if (ModelState.IsValid){
// Insert into database
}
// There was an error
return View(model);
}
RegisterModel.cs
public class RegisterModel
{
[Required]
[Display(Name = "UserName")]
public string UserName { get; set; }
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 4)]
[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; }
}
Register.cshtml
@model RegisterModel
<form asp-controller="Account" asp-action="Register" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal">
<h4>Create a new account.</h4>
<hr />
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label asp-for="UserName" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="UserName" class="form-control" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
<div class="form-group">
<label asp-for="Email" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="Email" class="form-control" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
</div>
<div class="form-group">
<label asp-for="Password" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="Password" class="form-control" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
</div>
<div class="form-group">
<label asp-for="ConfirmPassword" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="ConfirmPassword" class="form-control" />
<span asp-validation-for="ConfirmPassword" class="text-danger"></span>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<button type="submit" class="btn btn-default">Register</button>
</div>
</div>
</form>
Soultion Since The Register page was under Home controller, and the Register logic was in the Account controller i had to define the the view to load the Register.cshtml page.
[HttpPost]
public ActionResult Register(RegisterModel model){
if (ModelState.IsValid){
// Insert into database
}
// There was an error
return View("~/Views/Home/Register.cshtml",model)
}
回答1:
When you click on the submit button, it posts the form to the server where your action method has code to check whether the form is valid ( ModelState.IsValid
). This is server side validation. The form has to be posted to server for this to happen.
If you want to the validation to happen at client side (and not submit the form if the validation fails), you need to make sure that you have the relevant javascript libraries/files loaded to your page.
- jquery.validate.js
- jquery.validate.unobtrusive.js
You may include those in your layout file or your specific view. If it is the specific view, make sure you include those in the Scrips section.
@section Scripts
{
<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script src="~/lib/jquery-validation- unobtrusive/jquery.validate.unobtrusive.js"></script>
}
Update the path of the files to match with where you have those files in your project. You may also use the location to a public cdn.
来源:https://stackoverflow.com/questions/38511765/form-model-not-validating-before-post