1

ASP .NET MVC内に次の Create アクション メソッドがあります。

 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>

次に、「<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>エラーを表示したいビューに a を配置する必要があると思います。

次に、処理中にエラーが発生した場合は、エラー メッセージを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>

したがって、エラーが発生した場合は、そのエラーが表示されます

于 2013-08-20T06:30:42.660 に答える
0

networktable はどこで定義されていますか? 例外 (キャッチしたため) または ModelState エラーが発生した場合でも、ajax 応答はステータス 200 で返され、OnSuccess が実行されることに注意してください。保存ボタンの場合、サーバーから返された応答は、ネットワーク テーブルに既に含まれている HTML の後に挿入されます。障害が発生したときに特別なアクションを実行する必要がある場合は、サーバーで応答ステータスを変更し、ajax フォームで OnFailure によって呼び出されるクライアント側の関数を介してそれをキャッチする必要があります。

于 2013-08-20T08:53:40.513 に答える