2013-08-20 52 views
1

我有以下創建我ASP .NET中的操作方法MVC: -Ajax.Beginform +局部視圖+模式狀態工作不在一起

public ActionResult CreateVMNetwork(int vmid) 
     { 
      VMAssignIps vmips = new VMAssignIps() 
      { 
       TechnologyIP = new TechnologyIP() { TechnologyID = vmid}, 
       IsTMSIPUnique = true, 
       IsTMSMACUnique = true 
      }; 
      return PartialView("_CreateVMNetwork",vmips); 
     } 

這會使下面的局部視圖: -

@model TMS.ViewModels.VMAssignIps 

    @using (Ajax.BeginForm("CreateVMNetwork", "VirtualMachine", new AjaxOptions 

    { 
     InsertionMode = InsertionMode.InsertAfter, 
     UpdateTargetId = "networktable", 
     LoadingElementId = "loadingimag", 
     HttpMethod= "POST" 
    })) 
    { 
      @Html.ValidationSummary(true) 
      @Html.HiddenFor(model=>model.TechnologyIP.TechnologyID) 
     <div> 
<span class="f">IP Address</span> 

@Html.EditorFor(model => model.TechnologyIP.IPAddress) 
@Html.ValidationMessageFor(model => model.TechnologyIP.IPAddress)            

    <input type="CheckBox" name="IsTMSIPUnique" value="true" @(Html.Raw(Model.IsTMSMACUnique ? "checked=\"checked\"" : "")) /> | 
<span class="f"> MAC Address</span>  
@Html.EditorFor(model => model.TechnologyIP.MACAddress) 
@Html.ValidationMessageFor(model => model.TechnologyIP.MACAddress)            

<input type="CheckBox" name="IsTMSMACUnique" value="true" @(Html.Raw(Model.IsTMSMACUnique ? "checked=\"checked\"" : "")) /> 

</div> 
      <input type="submit" value="Save" class="btn btn-primary"/> 
    } 

裏面主要有以下看法,點擊Ajax.actionlink後: -

@Ajax.ActionLink("Add Network Info", "CreateVMNetwork","VirtualMachine", 
    new { vmid = Model.VirtualMachine.TMSVirtualMachineID }, 
    new AjaxOptions { 
InsertionMode = InsertionMode.Replace, 
UpdateTargetId = "AssignNetwork" , 
LoadingElementId = "progress" 


} 
) 
    </p> 
<p><img src="~/Content/Ajax-loader-bar.gif" class="loadingimage" id="progress" /></p> 
<div id ="AssignNetwork"></div> 

然後在「Save」按鈕,它會調用下面的操作方法,當點擊: -

[HttpPost] 
     public ActionResult CreateVMNetwork(VMAssignIps vmip) 
     { 
if (ModelState.IsValid) 
{ 
try 
{ 
repository.InsertOrUpdateVMIPs(vmip.TechnologyIP,User.Identity.Name); 
repository.Save(); 
return PartialView("_networkrow",vmip); 
} 
catch (Exception ex) 
{ 
ModelState.AddModelError(string.Empty, "Error occurred: " + ex.InnerException.Message); 
}} 
return PartialView("_CreateVMNetwork", vmip); 

} 

當將呈現以下的局部視圖_networkrow: -

@model TMS.ViewModels.VMAssignIps 
<tr id="@Model.TechnologyIP.ID"> 
    <td> @Model.TechnologyIP.IPAddress</td> 

    <td>@Model.TechnologyIP.MACAddress</td> 
    <td>@Ajax.ActionLink("Delete", 
"DeleteNetworkInfo", "VirtualMachine", 
new { id = Model.TechnologyIP.ID }, 

new AjaxOptions 
{ Confirm = "Are You sure You want to delete (" + Model.TechnologyIP.IPAddress + ")" + "(" + Model.TechnologyIP.MACAddress + ").", 
    HttpMethod = "Post", 

    OnSuccess = "deletionconfirmation", 
    OnFailure = "deletionerror" 
})</td> 
    </tr> 

上述所有將罰款除非發生模型狀態錯誤或異常,否則在這種情況下,將使用局部視圖更新表格,模型狀態將顯示在表格下方的字段中。但是我需要在同一個原始視圖上顯示模型狀態錯誤。所以我需要Ajax.begin表單才能在沒有發生異常或模型狀態錯誤時才更新表,並在原始部分視圖內顯示錯誤消息,而不是在表下。

任何人都可以建議如何解決這個問題?

回答

1

我不明白你的問題,但我認爲你應該把<div>放到你想要顯示錯誤的視圖中。

然後,如果您在處理時遇到了一些錯誤,請通過ViewBag向模型推送一些錯誤消息。

所以,你的操作方法會變成這個樣子:

[HttpPost] 
public ActionResult CreateVMNetwork(VMAssignIps vmip) 
{ 
if (ModelState.IsValid) 
{ 
    try 
    { 
     repository.InsertOrUpdateVMIPs(vmip.TechnologyIP,User.Identity.Name); 
     repository.Save(); 
     return PartialView("_networkrow",vmip); 
    } 
    catch (Exception ex) 
    { 
     ViewBag.ErrorMessage = "Some messages..."; 
     // also any other info you like 
    } 
} 

return PartialView("_CreateVMNetwork", vmip); 

} 

而且,在你看來是這樣的:

<div> 
    <p>@ViewBag.ErrorMessage</p> 
</div> 

所以,如果你你有一些錯誤,他們將被示在那

+0

感謝您的回覆,但這也會導致問題,因爲如果發生異常或模型狀態錯誤,則_CreateVMNetwork視圖將在表後插入方式。插入。因爲在所有情況下,即使局部視圖包含錯誤,Ajax.begin表單也會將局部視圖插入到表的末尾。現在更清楚我想要達到什麼目的? –

+0

@johnG - 我瞭解你。但是我無法找出哪些代碼是你的問題......刪除那些你沒有問題的代碼,並嘗試稀疏你的Q.我知道你正在尋找這樣的東西:'var isValid =' @ Html.Raw(Json.Encode(ViewData.ModelState。IsValid))';'但我無法幫你把它放在正確的地方...... – AminSaghi

0

networktable在哪裏定義?請記住,即使存在異常(因爲您已經捕獲它)或ModelState錯誤,ajax響應將返回狀態200,並且將執行OnSuccess。在保存按鈕的情況下,從服務器返回的響應將在任何networktable的html已經包含之後插入。如果您希望在發生故障時採取特殊措施,則必須更改服務器上的響應狀態,並通過ajax表單上由OnFailure調用的客戶端功能來捕獲它。

相關問題