2

フォームをコントローラーアクションに送信し、OnSuccessまたはOnFailureに基づいて応答を処理しようとしています。問題は、データが有効でなく、ModelState.IsValidテストに失敗した場合でも、OnSuccessメソッドが呼び出されることです。OnFailureメソッドを呼び出す必要があります。

私の見解:

@using (Ajax.BeginForm("UpdateCategory", "Home", null, new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "categoryForm", OnSuccess = "alert('success');", OnFailure = "alert('failure');" }, new { id = "formEditCategory" }))
{
    @Html.ValidationSummary(true)

    @Html.HiddenFor(model => model.CategoryID)

    <div>
        <div class="editor-label">
            @Html.LabelFor(model => model.CategoryName)
        </div>
        <div class="small-multiline-field">
            @Html.EditorFor(model => model.CategoryName)
        </div>
        <div class="validationMsg">
            @Html.ValidationMessageFor(model => model.CategoryName)
        </div>
    </div>
}

コントローラーのアクション:

[HttpPost]
public ActionResult UpdateCategory(CategoryVM category)
{
    try
    {
        if (ModelState.IsValid)
        {
            var itemService = new ItemViewModels();
            itemService.UpdateCategory(category);
        }
    }
    catch (DataException)
    {
        //Log the error (add a variable name after DataException)
        ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
    }

    return PartialView("EditCategoryInfo", category);
}

私のViewModel:

public class CategoryVM
{
    public int CategoryID { get; set; }

    [StringLength(75, ErrorMessage = "Category Name must be under 75 characters.")]
    [DataType(DataType.MultilineText)]
    [Display(Name = "Name")]
    public string CategoryName { get; set; }

    [StringLength(3800, ErrorMessage = "Category Description must be under 3800 characters.")]
    [DataType(DataType.MultilineText)]
    [Display(Name = "Description")]
    [AllowHtml]
    public string CategoryDesc { get; set; }

    [Display(Name = "Display on Web")]
    public bool DisplayOnWeb { get; set; }
}

したがって、75文字を超える文字列をCategoryNameフィールドに入力すると、フォームがModelState.IsValidテストに合格せず、ビューに「カテゴリ名は75文字未満である必要があります」という注釈が付けられて返送されることがわかります。エラーメッセージ。ただし、OnFailureイベントを発生させるのではなく、OnSuccessイベントを発生させます。なんで?

前もって感謝します。

4

3 に答える 3

6

例外をキャッチしたので、HTTP ステータス コード 200 の PartialView が返されます。そのため、OnSuccess がトリガーされます。

代わりにできることは、応答コードを明示的に 400 (不正な要求) に設定することです。

[HttpPost]
public ActionResult UpdateCategory(CategoryVM category)
{
    try
    {
        if (ModelState.IsValid)
        {
            var itemService = new ItemViewModels();
            itemService.UpdateCategory(category);
        }
    }
    catch (DataException)
    {
        //Log the error (add a variable name after DataException)
        ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
        Response.StatusCode = 400;
    }

    return PartialView("EditCategoryInfo", category);
}
于 2012-12-05T23:31:59.713 に答える
2

OnSuccessメソッドは、サーバーが 200 OK などの成功した HTTP 応答を返した場合、およびクライアントが応答を正常に受信してページを更新した場合に呼び出されます ( MSDNで説明されているように) 。

応答の内容を処理するのはあなた次第です。

于 2012-12-05T21:24:24.537 に答える
1

いくつかの調査 (および以下の Lukas のヘルプ) により、私はthisを発見し、これで問題が解決しました。

于 2012-12-05T22:47:40.470 に答える