1

我的ASP .NET MVC中有以下创建操作方法:-

 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.action 链接后:-

@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>

然后当点击“<code>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 表单仅在没有发生异常或模型状态错误的情况下更新表,并在原始局部视图中显示错误消息,而不是在表下。

任何人都可以就如何解决这个问题提出建议吗?

4

2 回答 2

1

我不清楚你的问题,但是我认为你应该<div>在你想要显示错误的地方放置一个。

然后,如果您在处理过程中遇到一些错误,请将一些错误消息推ViewBag送到模型。

所以,你的 action 方法会变成这样:

[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>

所以,如果你有一些错误,它们会显示在

于 2013-08-20T06:30:42.660 回答
0

网络表在哪里定义?请记住,即使出现异常(因为您已经捕获它)或 ModelState 错误,ajax 响应也会返回状态 200 并执行 OnSuccess。在保存按钮的情况下,从服务器返回的响应将被插入到任何网络表已经包含的 html 之后。如果您希望在发生故障时采取特殊措施,则必须更改服务器上的响应状态并通过 ajax 表单上 OnFailure 调用的客户端函数捕获它。

于 2013-08-20T08:53:40.513 回答