2014-11-05 52 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