I have this class used in MVC3...
The Validation Attributes for each property are working as it should but when the Validate method is called and any results are returned it is not posting back to the form. Can anyone help??
public class Register : IValidatableObject
{
[DataType(DataType.Text)]
[Display(Name = "District Name")]
[Required(AllowEmptyStrings = false, ErrorMessage = "You must enter a District Name")]
[StringLength(40, MinimumLength = 1, ErrorMessage = "District Name must be between 1 and 40 characters")]
public string DistrictName { get; set; }
[DataType(DataType.Text)]
[Display(Name = "Url Quick Find")]
[Required(ErrorMessage = "You must provide a Quick Find Name")]
[StringLength(15, MinimumLength = 3, ErrorMessage = "Url Quick Find must be between 3 and 15 characters")]
public string QuickFind { get; set; }
[DataType(DataType.Text)]
[Display(Name = "User name")]
[Required(AllowEmptyStrings = false, ErrorMessage = "User name is requred")]
[StringLength(10, MinimumLength = 1, ErrorMessage = "Url Quick Find must be between 1 and 10 characters")]
public string Username { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Password")]
[Required(AllowEmptyStrings = false, ErrorMessage = "Password is requred")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Re-Enter Password")]
[Required(AllowEmptyStrings = false, ErrorMessage = "You must re-enter your password to confirm you have entered it correctly")]
public string PasswordConfirm { get; set; }
[DataType(DataType.Text)]
[Display(Name = "Display Name")]
[Required(AllowEmptyStrings = false, ErrorMessage = "Display Name is requred")]
[StringLength(20, MinimumLength = 1, ErrorMessage = "Display Name must be between 1 and 20 characters")]
public string DisplayName { get; set; }
[DataType(DataType.EmailAddress)]
[Display(Name = "Email Address")]
[Required(AllowEmptyStrings = false, ErrorMessage = "Email Address is requred")]
[StringLength(50, MinimumLength = 4, ErrorMessage = "Email Address must be between 4 and 50 characters")]
public string EmailAddress { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
Regex lettersOnly = new Regex("^[a-zA-Z]*$");
if (!lettersOnly.IsMatch(QuickFind))
yield return new ValidationResult("Only letters A - Z are allowed in the Quick Find", new string[] { "QuickFind" });
if (!lettersOnly.IsMatch(QuickFind))
yield return new ValidationResult("Only letters A - Z are allowed for your User name", new string[] { "Username" });
if (Password != PasswordConfirm)
yield return new ValidationResult("Passwords do not match", new string[] { "Password", "PasswordConfirm" });
}
}
Controller Code:
[HttpPost]
public ActionResult Index(Register registration)
{
try
{
User newUser = RegistrationManager.Register(registration);
RedirectToAction("Index", "District", newUser.ID);
}
catch (Exception ex)
{
ModelState.AddModelError("There has been an Error during Registration", ex.Message);
RedirectToAction("Details", "Error", ex);
}
return View();
}
View Code:
@model PubGames.Data.Register
@{
ViewBag.Title = "Register";
}
<h2>
Register</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<div class="editor-label">
@Html.LabelFor(model => model.DistrictName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DistrictName)
@Html.ValidationMessageFor(model => model.DistrictName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.QuickFind)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.QuickFind)
@Html.ValidationMessageFor(model => model.QuickFind)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Username)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Username)
@Html.ValidationMessageFor(model => model.Username)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Password)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PasswordConfirm)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PasswordConfirm)
@Html.ValidationMessageFor(model => model.PasswordConfirm)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.DisplayName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DisplayName)
@Html.ValidationMessageFor(model => model.DisplayName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.EmailAddress)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.EmailAddress)
@Html.ValidationMessageFor(model => model.EmailAddress)
</div>
<p>
<input type="submit" value="Register" />
</p>
}