根据表单提交结果动态更改Ajax.BeginForm()的UpdateTargetId

时间:2014-11-05 07:36:57

标签: asp.net asp.net-mvc asp.net-mvc-4 razor asp.net-ajax

如果有人可以提供帮助,我会很感激。

我想根据用户类型返回不同的部分视图:

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

1 个答案:

答案 0 :(得分:1)

因为验证是在服务器端完成的,所以您可以设置响应的状态代码(Controller.Response)。

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