考虑以下带有三个提交按钮的html:
@using (Html.BeginForm("Process", "Part4", FormMethod.Post, new { id = "submitForm" }))
{
<select class="form-control" name="lbToolingID" id="lbToolingID">
@foreach (var toolingID in toolingIDList)
{
<option value="@toolingID">@toolingID</option>
}
<input class="btn btn-primary" type="submit" name="btnAction" value="Add Tooling" />
@* Selected tool will be added here on the [Add Tooling] button click *@
<table>
@if (Model != null && Model.M_PartTooling_List != null && Model.M_PartTooling_List.Count > 0)
{
for (int i = 0; i < Model.M_PartTooling_List.Count; i++)
{
<tr>
<td nowrap>
@Html.ActionLink("Remove Location", "Remove", new { @id = Model.M_PartTooling_List[@i].ID }, new { @class = "btn-sm btn-danger" })
</td>
<td nowrap colspan="2">
@Html.HiddenFor(model => model.M_PartTooling_List[i].ToolingID)
@(Model.M_PartTooling_List[i].ToolingID)
</td>
</tr>
}
}
</table>
@* Once done these buttons will add the records into database *@
<input class="btn btn-success" type="submit" name="btnAction" value="Save & Return To List" />
<input class="btn btn-success" type="submit" name="btnAction" value="Save & Continue Create" />
}
...
...
@section Scripts
{
@Scripts.Render("~/bundles/jqueryval")
}
以下是行动:
[HttpPost]
public ActionResult Process(M_PartViewModels m_PartViewModels, string btnAction, string lbToolingID)
{
if (btnAction == "Add Tooling")
{
AddPartTooling(m_PartViewModels, lbToolingID);
return View("Create", m_PartViewModels);
}
CreatePart(m_PartViewModels);
if (btnAction == "Save & Return To List")
{
return RedirectToAction("Index");
}
return RedirectToAction("Create");
}
第一次点击Add Tooling
按钮时,它工作正常,我们可以看到在断点处btnAction
的值确实为Add Tooling
:
但是,第二次点击Add Tooling
按钮或任何其他两个按钮时,btnAction
的值变为null
:
我们已经在浏览器中检查了所述按钮,我们可以看到该按钮的值仍然完整:
有人可以指出导致这种情况的原因以及如何解决这个问题吗?
我知道我们可以使用jQuery来解决这个问题,但是如果可能的话,我们希望尝试使用最少的jQuery编码。
更新
删除对此脚本的引用使页面按预期工作,但它禁用了我们拥有的任何其他(远程)验证:
@section Scripts
{
@Scripts.Render("~/bundles/jqueryval")
}
会更多地了解这一点。可能是我们可以在Add Location
按钮上暂时禁用对远程验证的调用。
更新2017-06-22 0017使用OK解决方案 - jquery.validate *是罪魁祸首?
这可能不是我想要的解决方案,但只要它正常工作我就可以了。
因为我们已经知道删除了
@Scripts.Render("~/bundles/jqueryval")
使页面按预期工作。
这是捆绑定义:
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include("~/Scripts/jquery.validate*"));
我决定放弃远程验证
[Remote("CheckPartID", "Part", AdditionalFields = "PartID_Ori", ErrorMessage = "Part ID already in use!")]
在我的模型注释中定义,并将验证移植到我的操作中:
[HttpPost]
public ActionResult CreateProcess(M_PartViewModels m_PartViewModels, string btnAction, string lbToolingID)
{
ViewBag.VMainMenu = GetMenu();
ViewBag.ToolingIDList = GetToolingID();
CheckPartID(m_PartViewModels);
CheckPartDesc(m_PartViewModels);
if (btnAction == "Add Tooling")
{
AddPartTooling(m_PartViewModels, lbToolingID);
return View("Create", m_PartViewModels);
}
if (ModelState.IsValid)
{
// Do some DB insert stuff
if (btnAction == "Save & Return To List")
{
return RedirectToAction("Index");
}
else
{
return RedirectToAction("Create");
}
}
return View("Create", m_PartViewModels);
}
public void CheckPartID(M_PartViewModels m_PartViewModels)
{
if (m_PartViewModels.M_Part.PartID != m_PartViewModels.M_Part.PartID_Ori)
{
var routingID = db.M_Part.Where(u => u.PartID == m_PartViewModels.M_Part.PartID).FirstOrDefault();
if (routingID != null)
{
ModelState.AddModelError("M_Part.PartID", "Part ID already exists.");
}
}
}
public void CheckPartDesc(M_PartViewModels m_PartViewModels)
{
if (m_PartViewModels.M_Part.PartDesc != m_PartViewModels.M_Part.PartDesc_Ori)
{
var routingID = db.M_Part.Where(u => u.PartDesc == m_PartViewModels.M_Part.PartDesc).FirstOrDefault();
if (routingID != null)
{
ModelState.AddModelError("M_Part.PartDesc", "Part Description already exists.");
}
}
}
虽然我觉得这个解决方案并不完全满意(验证只会在提交时触发提交),但由于它按预期工作,现在将使用它。
一旦找到更好的方法就会更新。
感谢您的关注。对此,我真的非常感激。 :)