2011-12-29 95 views
1

我有这个类中MVC3使用...IValidatableObject validate方法不工作

的属性验证,每个属性都工作良好,但是当验证方法被调用任何结果返回它不回发到表格。 任何人都可以帮忙吗?

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" }); 

    } 
} 

控制器代码:

[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(); 
    } 

查看代码:

@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> 
} 
+1

你还需要在控制器中显示相关的代码,并查看。 – 2011-12-29 02:24:24

+0

添加控制器和视图代码 – 2011-12-29 09:10:13

+0

仅供参考,您并不需要'IValidatableObject'来验证代码示例中显示的验证;您可以单独使用数据注释获得相同的结果:'[RegularExpression(@“^ [a-zA-Z] * $”,ErrorMessage =“只允许{0}中的字母A-Z。”)]'和' [比较(“密码”,ErrorMessage =“密码不匹配。”)]'。数据注释还为您提供客户端验证。 – 2012-01-14 22:55:15

回答

1

这么多的问题...

的典型操作方法是这样的:

public ActionResult DoSomething(MyModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     return RedirectToAction("somethign"); 
    } 
    return View(model); 
} 

这确实几件事情,但主要是返回到视图模式状态下,如果它是无效的。你没有这样做,实际上你甚至不会将模型返回到视图。您不检查状态是否有效,因此即使验证服务器未通过验证,它也会尝试调用注册方法。你也没有返回你的ActionResults,即RedirectToAction,你只是在调用它..

+0

ModelState.IsValid - 谢谢! – 2011-12-29 10:08:57

0

你的意思是 “不张贴回表” - 你的意思是在”错误t出现? 确保

  1. 你的页面
  2. 在验证摘要你创建信息后没有进行重定向。
  3. 知道这是不是客户端验证(只是说,你可能已经知道)
1

你没有正确重定向。您必须返回 RedirectToAction:

[HttpPost] 
public ActionResult Index(Register registration) 
{ 
    try 
    { 
     User newUser = RegistrationManager.Register(registration); 
     return RedirectToAction("Index", "District", newUser.ID); 
    } 
    catch (Exception ex) 
    { 
     ModelState.AddModelError("There has been an Error during Registration", ex.Message); 
     return RedirectToAction("Details", "Error", ex); 
    } 

    return View(registration); 
} 

此外,当您在例外的情况下重定向你会失去你已经添加到ModelState中的任何错误。