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 の Validate メソッドを使用して Create プロパティを検証します。また、これは私の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 メソッドは、Create の日付の年が現在の年 (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();
        }
    }

私は何をしなければなりませんか?ありがとう

4

1 に答える 1

2

1 回は投稿してモデル バインダーが newReview にバインドされ、もう 1 回は SaveChanges を呼び出すため、2 回呼び出されます。

あなたがすべきことは、ModelState.IsValid= false の場合はチェックを投稿するときです。そうであれば、View(newReview); を返します。

さらに、DbEntityValidationException は View(newReview); を返す必要があります。

そして最後に、私がここに書いたアクション フィルターを確認してください。try キャッチは必要ありません。単にコントローラーのメソッドで属性を使用するか、HandleError で行われるようにアプリケーションの起動時に登録します。

MapEntityExceptionsToModelErrorsAttribute

于 2012-11-24T08:31:58.517 に答える