2014-11-05 117 views
1

如果有人能提供帮助,我将不胜感激。根据表单提交结果动态更改Ajax.BeginForm()的UpdateTargetId

我想回到根据用户类型不同的部分观点:

[HttpPost] 
public ActionResult Edit(ContractModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     if (curUser.IsInputer) { .... return View("Contracts");} 
     else if(curUser.IsAuthorizer) { ..... return View("Details");} 
    } 

    return PartialView(model); 
} 

查看:

 @{ 
     string updateRegion = ""; 

     if (curUser.IsInputer) 
     { 
      updateRegion = "content"; 
     } 
     else if (curUser.IsAuthorizer) 
     { 
      updateRegion = "mainPane"; 
     } 
    } 
<script> 
    function returnViewOnFailure(result) { //not firing on submission failure 
     $("#mainPane").html(result); 
    } 
</script> 
    @using (Ajax.BeginForm("Edit", new AjaxOptions() { UpdateTargetId = updateRegion, 
                 InsertionMode = InsertionMode.Replace, 
                 OnFailure = "returnViewOnFailure" })) 
    {.........} 

问题是,当ModetState.IsValid = false我的功能returnViewOnFailure不点火。 我想UpdateTargetId"mainPane"如果表单提交失败(不管用户类型),否则应该取决于curUser

编辑:

所以,我使用Ajax调用透过的形式建议:

<script> 
var form = $('#contract_form'); 
form.submit(function (ev) { 
    $.ajax({ 
     cache: false, 
     async: true, 
     type: "POST", 
     url: form.attr('action'), 
     data: form.serialize(), 
     success: function (data) { 
      $("#content").html(data); 
      //How to check ModelState.IsValid and show errors? 
     } 

    }); 
    ev.preventDefault(); 
}); 

+0

当视图第一次加载时,Ajax.BeginForm会在服务器上评估,因此无论该方法返回什么,它总是会使用相同的'targetID'。其次,你不会抛出任何错误,所以'OnFailure'永远不会被击中。 – 2014-11-05 07:47:24

+0

查看由Ajax.BeginForm方法生成的html。 targetId被放置在属性“data-ajax-update”中。实现一些在提交表单时改变属性值的java脚本。 – Tobias 2014-11-05 08:13:24

+0

如果我检查ViewContext.ViewData.ModelState在页面加载和$(“#mainPane”)。html(内容)上的有效性,但是如何获取内容呢? – 2014-11-05 09:24:01

回答

1

因为验证完成服务器端可以设置的的StatusCode响应(Controller.Response)。

如果验证不成功,则将其设置为500(内部服务器错误),以便调用ajax.onfailure。将验证错误逻辑(替换divs内容)放在那里。或者,你甚至可以在o​​nfailure中更改updatetargetid(通过javascript)。

+0

非常感谢!这正是我需要的。顺便说一句我想如果我更改updateTargetID,它将工作,只有当我再次形式表单。非常感谢! – 2014-11-06 13:01:47