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

我的视图模型:

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

因此,如果我在 CategoryName 字段中输入超过 75 个字符的字符串,我可以看到该表单未通过 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如果服务器返回成功的 HTTP 响应(例如 200 OK)并且客户端成功接收到响应并更新页面(如MSDN中所述) ,则调用该方法

由您来处理响应的内容。

于 2012-12-05T21:24:24.537 回答
1

通过更多的研究(以及下面 Lukas 的帮助),我发现了这个,它解决了我的问题。

于 2012-12-05T22:47:40.470 回答