Ajax 表单在 ASP MVC 中具有不同的操作

Ajax form with different actions in ASP MVC

在 ASP.NET MVC 中,我有以下输入形式(简化):

<div id="ajaxtarget">
@using (Ajax.BeginForm("SubmitForm", "Home", new AjaxOptions { UpdateTargetId = "ajaxtarget" }))
{
        @Html.DropDownListFor(x => x.PostalCode, Model.PostalCodeItemList, new { @name = "PostalCodeId" , @id="PostalCodeId" })

        @Html.LabelFor(x => x.StreetCode)
        @Html.DropDownListFor(x => x.StreetCode, Model.StreetItemList, new {  @id="StreetCodeId" })

        ...
        <input type="submit" value="@Global.Execute" id="btnSubmit" />
}
</div>

当用户从第一个下拉列表中选择内容时,应通过 AJAX 填充第二个下拉列表。我可以通过 javascript 发送 'call' 我的控制器来更新我的视图:

$(document).ready(function () {
        $('#PostalCodeId').on('change', function () {
            $(this).parents('form').submit();
        });
    });

我的问题是我的表单有很多不同的控件,这些控件会触发我需要在控制器中处理的某些操作,因此我正在寻找一种方法来在提交表单时添加一些额外的参数。

现在我找到了一个解决方案,我在我的模型和我的表单中添加了一个额外的字段,我在 javascript 中填充,具体取决于哪个控件触发脚本。 @Html.HiddenFor(x => x.ChosenControllerAction, new { id = "ChosenAction" }) 在我的控制器中,我可以 return 基于此值的视图或操作:

    public ActionResult SubmitForm(MyModel model) 
    {
        if (model.ChosenControllerAction == "PopulateStreetCodes")
        {
          ...
        }

我确定一定有一种 different/better 方法可以实现我想做的事情。在复杂的 自更新 ajax 表单中 return 正确的 ActionResults 的正确方法是什么?

正确的方法是为您要在控制器中执行的每个操作创建一个方法。对于这些操作中的每一个,您都应该有一个 javascript 代码。

示例:

控制器

public ActionResult PopulateFirstDropdown(MyModel model)
{
    // Return the new values for your first dropdownlist
    // Or the partial view
}

public ActionResult PopulateSecondDropdown(MyModel model)
{
    // Return the new values for your second dropdownlist
    // Or the partial view
}

public ActionResult SubmitForm(MyModel model)
{
    // Save the form
}

Javascript :

$('#FirstField').on('change', function() {
    $.ajax({
        url: "/YourController/PopulateFirstDropdown",
        type: "POST",
        data:  $(this).closest('form').serialize(),
        success: function (data) {
            // Use data to refresh dropdownlist
            // or refresh the content of the partial view
        },
    });
});

$('#OtherField').on('change', function() {
    $.ajax({
        url: "/YourController/PopulateSecondDropdown",
        type: "POST",
        data:  $(this).closest('form').serialize(),
        success: function (data) {
            // Use data to refresh dropdownlist
            // or refresh the content of the partial view
        },
    });
});

如果我的回答不够清楚,请告诉我。