0

次のように部分ビューをレンダリングするための Ajax.Actinolink を含む次のメイン メニューがあります。

    @model TMS.ViewModels.VMJoin

    @{
        ViewBag.Title = "Details";
    }

    <h2>Details</h2>


    <div class="row-fluid sortable">        
                    //code goes here
                        <div class="box-content">
    <p>
    @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 goes here
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

アクションメソッドは次のとおりです:-

[HttpPost]
        [ValidateAntiForgeryToken]
        [CheckUserPermissions(Action = "Edit", Model = "Virtual Machine")]
        public ActionResult CreateVMNetwork(AssignIps vmip)
        {
  //code goes here
            if ((Request.Form["IsTMSIPUnique"] == "true") && (!IT360ipunique || !TMSipunique))
            {

                return Json(new { IsSuccess = "False", description = "IP Address Already Exsists." }, JsonRequestBehavior.AllowGet);

            }
            if ((Request.Form["IsTMSMACUnique"] == "true") && (!IT360macunique || !TMSmacunique))
            {

                return Json(new { IsSuccess = "False", description = "MAC Address Already Exsists." }, JsonRequestBehavior.AllowGet);

            }
            if (String.IsNullOrEmpty(vmip.TechnologyIP.IPAddress) || String.IsNullOrEmpty(vmip.TechnologyIP.MACAddress))
            {

                return Json(new { IsSuccess = "False", description = "Please Make sure to insert both values." }, JsonRequestBehavior.AllowGet);
            }
            if (ModelState.IsValid)
            {
                try
                {
                    string ADusername = User.Identity.Name.Substring(User.Identity.Name.IndexOf("\\") + 1);
                    repository.InsertOrUpdateIPs(vmip.TechnologyIP,ADusername);
                    repository.Save();

                    return PartialView("_networkrow",vmip);

                }
                catch (Exception ex)
                {

                    //ModelState.AddModelError(string.Empty, "Error occurred: " + ex.InnerException.Message);
                    return Json(new { IsSuccess = "False", description = ex.InnerException.InnerException.Message.ToString() }, JsonRequestBehavior.AllowGet);
                }

            }

            return PartialView("_CreateVMNetwork", vmip);

        }

そして、アクション メソッド呼び出しからレンダリングされた部分ビューは次のとおりです。

@model TMS.ViewModels.AssignIps

    @if (this.ViewContext.FormContext == null) 
{
    this.ViewContext.FormContext = new FormContext(); 
}

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

{
    InsertionMode = InsertionMode.InsertAfter,
    UpdateTargetId = "networktable",
    LoadingElementId = "loadingimag",
    HttpMethod= "POST",
    OnSuccess="submitform"





}))
{
    @Html.ValidationSummary(true)
    @Html.HiddenFor(model=>model.TechnologyIP.TechnologyID)

 @Html.AntiForgeryToken()
<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\"" : "")) /> IP Unique.    | 
 <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\"" : "")) /> MAC Unique.

</div>


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

    @Scripts.Render("~/bundles/jqueryval")  

しかし、私が直面している問題は、レンダリングされた部分ビュー内の [保存] ボタンをクリックすると、2 つの投稿要求が送信されることです。@Scripts.Render("~/bundles/jqueryval") この問題は、スクリプトへの 2 つの参照があるという事実に関連していると思います。1 つはメイン ビューで、もう 1 つは部分ビューです。しかし同時に、メイン ビューでは ajax 機能が必要であり、部分ビューでは jquery 検証が必要であるため、これらの参照を削除することはできません。

この重複したリクエストの問題を解決する方法を教えてください。

4

1 に答える 1

0

実際には、スクリプトを 2 回レンダリングする必要はありません。部分ビューがロードされているメイン ビューでスクリプトがレンダリングされている限り、スクリプトの機能にアクセスできます。解決策は、スクリプトを再度ロードすることではなく、スクリプトが提供した機能を使用して、ロードされたときの動作を複製することです。検証モジュールを使用して、html 要素を再度解析します。これは、次の関数を呼び出すだけで実行できます。

$.validator.unobtrusive.parse(selector)

html ページ全体を再度解析する必要はなく、新しく挿入された要素のみを解析する必要があります。そうすれば、すべての ajax と目立たない機能をメイン ビューにロードし、部分ビューをロードするときにそれを呼び出して、二重ポストなしですべてがうまくいくようにします。

于 2013-12-19T14:52:31.160 に答える