如果有人可以提供建议,我会非常感激。
我有一个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。为什么会这样?
答案 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
您以发布模式发布应用程序。
修改:删除了使用其他状态代码的提及,因为它引起了更多的混淆并且无法解决问题。