【问题标题】:Ajax form with different actions in ASP MVCASP MVC 中具有不同操作的 Ajax 表单
【发布时间】:2016-01-21 18:52:28
【问题描述】:

在 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 发送“呼叫”我的控制器来更新我的视图:

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

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

现在我找到了一个解决方案,我在我的模型和表单中添加了一个额外的字段,我根据哪个控件触发脚本来填充 javascript。 @Html.HiddenFor(x =&gt; x.ChosenControllerAction, new { id = "ChosenAction" }) 在我的控制器中,我可以根据这个值返回一个视图或动作:

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

我确信一定有一种不同/更好的方式来归档我想做的事情。以复杂的自我更新 ajax 形式返回正确的 ActionResults 的正确方法是什么?

【问题讨论】:

  • 第二个下拉列表应该通过 AJAX 填充??您根本没有这样做 - 您的脚本只是提交表单。你真正想做的是什么?
  • 没错,我正在通过 ajax 提交表单,并且基于第一个下拉列表中的选择,我的 ajaxtarget 将被刷新,并且我的模型中第二个列表的值也会被更新。实际上,形式比这更复杂。我说出了我真正想做的事情:“我正在寻找一种在提交表单时添加一些额外参数的方法。”
  • 但是你在你的问题中说过 第二个下拉列表应该通过 AJAX 填充基于第一个的选择 - 即级联下拉列表。您无需提交表单来执行此操作。参考this answerthis DotNetFiddle的例子
  • 这是一个简化的例子。我选择了更新包含我的表单的 DIV 的 AJAX 表单的路由,如果可能的话,我更喜欢这种方式...
  • 没问题(如果您对性能不佳感到满意)

标签: jquery asp.net-mvc asp.net-mvc-4 razor asp.net-ajax


【解决方案1】:

正确的方法是为您想要在控制器中执行的每个操作创建一个方法。并且您应该为每个操作都有一个 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
        },
    });
});

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

【讨论】:

  • 我不懂javascript代码。我想success: function (data) 应该像 url MyController/Action 一样触发控制器的 ActionResult 吗?问题是,它没有......我已经在控制器的方法中设置了一个断点,但我没有到达那里。
  • ajax 方法在您传入参数的 url 处向服务器发送异步请求。 success 参数表示当请求返回没有问题时将执行的函数。 “data”参数将包含服务器返回的数据(控制器方法返回的内容)。您可以在此处查看 AJAX 教程:link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多