Мой частичный просмотр отправляет два запроса Post на мой метод действия
У меня есть следующее главное меню, которое содержит 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")
Но проблема, с которой я сталкиваюсь, заключается в том, что при нажатии на кнопку "Сохранить" внутри визуализированного частичного представления будут отправлены два запроса на публикацию. Я думаю, что проблема связана с тем, что у меня есть две ссылки на @Scripts.Render("~/bundles/jqueryval")
сценарии: один в главном окне, а другой в частичном. Но в то же время я не могу удалить ни одну из этих ссылок, поскольку на главном экране мне нужны функции ajax, а на частичном - мне нужна проверка jquery.
Кто-нибудь может посоветовать, пожалуйста, как решить эту проблему с дублирующимися запросами?
1 ответ
Вам на самом деле не нужно визуализировать сценарии дважды. Вы можете получить доступ к функциональности сценариев, если они отображаются в главном представлении, в которое загружается частичное представление. Решение НЕ в том, чтобы загружать скрипты во второй раз, а в том, чтобы использовать функции, которые дал вам скрипт, чтобы копировать то, что он делает при загрузке. Используйте модуль проверки для повторного анализа html-элементов. Это можно сделать простым вызовом следующей функции:
$.validator.unobtrusive.parse(selector)
Вам не нужно снова анализировать всю html-страницу, только анализировать только что вставленные элементы. Таким образом, вы получаете все функции ajax и ненавязчивой загрузки в главном представлении и вызываете его, когда загружается ваше частичное представление, чтобы все работало без двойной записи.