2012-11-24 279 views
0

我有一个“评论”类别:验证功能无法正常工作

public class Review : IValidatableObject 
{ 
    public int ReviewId { get; set; } 

    [DisplayName("Digning Date")] 
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
    [DataType(DataType.Date)] 
    public DateTime Created { get; set; } 

    [Range(1, 10)] 
    public int Rating { get; set; } 

    [Required] 
    [DataType(DataType.MultilineText)] 
    public string Body { get; set; } 
    public int RestaurantId { get; set; } 
    public virtual Restaurant Resturant { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var fields = new[]{ "Created"}; 

     if(Created > DateTime.Now) 
     { 
      yield return new ValidationResult("Created date cannot be in the future.", fields); 
     } 

     if (Created < DateTime.Now.AddYears(-1)) 
     { 
      yield return new ValidationResult("Created date cannot be to far in the past.", fields); 
     } 
    } 
} 

它采用IValidatableObject的验证方法来验证创建属性。也这是我的CSHTML代码:

@model OdeToFood.Models.Review 

@{ 
ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

@section scripts 
{ 
<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) 
<fieldset> 
    <legend>Review</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Created) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Created) 
     @Html.ValidationMessageFor(model => model.Created) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Rating) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Rating) 
     @Html.ValidationMessageFor(model => model.Rating) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Body) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Body) 
     @Html.ValidationMessageFor(model => model.Body) 
    </div> 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

<div> 
@Html.ActionLink("Back to List", "Index") 
</div> 

validate方法简单地请检查是否创建的日期的年份在本年度(2012年),或在去年(2011年)。因此,如果用户输入2000年,他应该会收到错误:“创建日期不能在将来。”但我不工作!

也这是我的配置在web.config中:

<appSettings> 
    <add key="webpages:Version" value="1.0.0.0" /> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
</appSettings> 

这也是我的控制器代码:

public ActionResult Create() 
    { 
     return View(new Review()); 
    } 

    // 
    // POST: /Reviews/Create 

    [HttpPost] 
    public ActionResult Create(int restaurantId, Review newReview) 
    { 
     try 
     { 
      //_db is my DBContext 
      var restaurant = _db.Restaurants.Single(r => r.RestaurantId == restaurantId); 
      newReview.Created = DateTime.Now; 

      restaurant.Reviews.Add(newReview); 
      _db.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 
     catch(System.Data.Entity.Validation.DbEntityValidationException ex) 
     { 
      return View(); 
     } 
    } 

什么,我必须做什么? 感谢

+0

您是否尝试过调试以查看Validate方法是否被调用?你也可以发布你的控制器这个视图的操作方法代码,请。 –

+0

@PaulTaylor我调试。验证方法执行两次!在第一次执行它验证,但在第二它不验证! –

回答

2

,因为一旦当您发布它越来越调用两次和模型结合剂结合newReview,而一旦当你调用的SaveChanges。

你应该做的,当你张贴检查,如果ModelState.IsValid =假,如果是的话返回查看(newReview);

除了你DbEntityValidationException应返回查看(newReview);

,最后检查出的动作过滤器我写到这里 - 你不需要有一个尝试捕捉 - 只需使用属性上的控制器的方法或注册它在应用程序启动等与调用HandleError

MapEntityExceptionsToModelErrorsAttribute完成