从控制器,ASP.NET MVC调用表单OnFailure处理程序

时间:2015-01-09 11:10:59

标签: c# jquery asp.net asp.net-mvc asp.net-ajax

如果有人可以提供建议,我会非常感激。

我有一个Ajax表单:

  @using (Ajax.BeginForm("Edit", null, new AjaxOptions() { 
                                       UpdateTargetId = updateRegion, 
                                       InsertionMode = InsertionMode.Replace, 
                                       OnFailure = "formFailure" }))
    {}

UpdateTargetId因当前用户角色而异:

@{
   if (curUser.IsInputer)
    {
        updateRegion = "content";
    }
    else if (curUser.IsAuthorizer)
    {
        updateRegion = "mainPane";
    }
}

如果模型状态无效,我希望始终在mainPane中返回视图:

<script>
function formFailure(result)
{
    $("#mainPane").html(result.responseText);        
}
</script>

但是当ModelState无效时,不会调用onFailure。为此,我在控制器中设置了错误代码:

public ActionResult Edit(ContractModel entity)
 {
    if(ModelState.IsValid)
    { 
       if(curUser.isInputer) { return RedirectToAction("SomeAction");}
       if(curUser.Authorizer) { return RedirectToAction("OtherAction");}
    }

     Response.StatusCode = 500;//internal server error to fire OnFailure of form
     return PartialView(entity);
 }

然后我得到了所需的结果,即我在浏览器控制台中看到mainPane div中的错误和内部服务器错误的模型。但是,当我在本地运行应用程序时,它以这种方式工作,当我在服务器上发布并运行它时,我看到错误500 Internal server error,而不是局部视图。有没有解决方法?

修改 作为一个选项,我试图检查模型OnSuccess处理程序中的错误:

    var isValid = @Html.Raw(Json.Encode(ViewData.ModelState.IsValid));

        if (!isValid) {

            $("#mainPane").html(result.responseText);    
        }

但我仍然可以在#34;内容&#34; DIV。为什么会这样?

2 个答案:

答案 0 :(得分:1)

这是一个选项:

不要使用500状态错误。这是为了报告您的应用程序出现问题。 这不是这里发生的事情,你只是有一个表单验证错误。

将服务器端代码更新为:

public ActionResult Edit(ContractModel entity)
 {
    if(ModelState.IsValid)
    { 
       if(curUser.isInputer) { return RedirectToAction("SomeAction");}
       if(curUser.Authorizer) { return RedirectToAction("OtherAction");}
    }

    if(!ModelState.IsValid)
    {
        entity.FormError = true; // you will need to add this attribute to your model
    }

    return PartialView(entity);
}

然后在你的局部视图中,输入以下内容:

if(Model.FormError)
{
    @Html.HiddenFor(m => m.FormError)
}

更改您的表单以处理OnComplete事件而不是OnFailure事件。这是因为你的ajax帖子没有失败。它成功返回并报告表单输入验证错误:

@using (Ajax.BeginForm("Edit", null, new AjaxOptions() { OnSuccess = "handleFormResponse" }))
  {}

将处理程序脚本更改为此类似的内容。这将检查响应以查看是否包含表单错误

  <script>
  function handleFormResponse(result)
  {
        $(result).find("#FormError").length > 0)
        {
            $("#mainPane").html(result);  
        }
        else
        {
            $("#@updateRegion").html(result);
        }

  }
  </script>

答案 1 :(得分:0)

这种情况很可能发生,因为服务器将500解释为无法处理的错误,并返回默认的500错误,因为网络配置中的customErrors设置可能会转为false您以发布模式发布应用程序。

修改:删除了使用其他状态代码的提及,因为它引起了更多的混淆并且无法解决问题。