随后单击

时间:2017-06-21 00:13:36

标签: html asp.net-mvc submit-button

考虑以下带有三个提交按钮的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

enter image description here

但是,第二次点击Add Tooling按钮或任何其他两个按钮时,btnAction的值变为null

enter image description here

我们已经在浏览器中检查了所述按钮,我们可以看到该按钮的值仍然完整:

enter image description here

有人可以指出导致这种情况的原因以及如何解决这个问题吗?

我知道我们可以使用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.");
            }
        } 
    }

虽然我觉得这个解决方案并不完全满意(验证只会在提交时触发提交),但由于它按预期工作,现在将使用它。

一旦找到更好的方法就会更新。

感谢您的关注。对此,我真的非常感激。 :)

0 个答案:

没有答案