【问题标题】:Sending selected value of Drop Down List back to a Controller Action using jQuery Ajax MVC4使用 jQuery Ajax MVC4 将下拉列表的选定值发送回控制器操作
【发布时间】:2014-01-10 14:23:44
【问题描述】:

我正在尝试使用 MVC4 Web 应用程序中的 jQuery Ajax 将下拉列表中选定项目的值发送回控制器中的 Action 方法。我有一个名为 MeditechDropDown 的下拉列表,这是我的 jQuery 函数,它不太工作。我设法达到我的 Action 方法,但传入的值为 null。

jQuery(document).ready(function () {
    $("#MeditechDropDown").change(function () {
        $.ajax({
            url: "/Home/PopulateEmailAddressUI",
            data: JSON.stringify('id=' + $(this).val()), // Send value of the drop down change of option
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            success: function (data) {
                // Variable data contains the data you get from the action method
            }
        });
    });
});

动作名称是 PopulateEmailAddressUI。有人会善意地阐明我做错了什么吗?我知道我没有正确编写我的 jQuery 函数。非常感谢。

【问题讨论】:

  • 你尝试在你的ajax调用中设置dataType: 'json'
  • 是的,现在已经这样做了。但仍然为空。
  • 我已经更新了答案以显示我的控制器代码,如果有帮助的话

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


【解决方案1】:

我在 .NET MVC4 中编写了一些成功的 jQuery ajax 调用。这就是他们的样子:

$('#projectList').on('click', 'li', function () {
        pid = $(this).data('id');

        $.ajax({
            type: 'POST',
            url: '/Admin/GetProject',
            data: '{ id: ' + pid + ' }',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            success: function (data) {
                projectRetrieved(data);
            }
        });

    });

控制器:

        [HttpPost]
        public ActionResult GetProject(int id) {
            string connStr = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;
            SqlConnection conn = new SqlConnection(connStr);

            string sql = "SELECT * FROM [Portfolio] WHERE [id] = @id";
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            da.SelectCommand.Parameters.Add(new SqlParameter("@id", id));
            DataTable dt = new DataTable();

            conn.Open();
            da.Fill(dt);
            da.Dispose();
            conn.Close();

            return Json(objConv.DataTableToArrayList(dt), JsonRequestBehavior.AllowGet);
        }

【讨论】:

  • 谢谢你。问题是您在 GetProject 操作方法中读取 (int id) 的位置,我在 PopulateEmailAddressUI 方法中读取 (string clientID),因为它是字母数字。并且 clientID 以 null 的形式出现。
  • @user3041439 我怀疑这条线:data: JSON.stringify('id=' + $(this).val()) 是给你带来问题的原因。将$(this).val() 分配给ajax 调用之外的变量,看看是否有效。如果仍然没有成功,请尝试手动写出您的数据对象:'{ id: "' + id + '"}'
  • 我现在已经在我自己的答案中发布了我最新版本的 jQuery 函数。请问还有其他想法吗?谢谢。
【解决方案2】:

你可以这样写:

     jQuery(document).ready(function () {
    $("#MeditechDropDown").change(function () {
        var id=$(this).val();
        $.ajax({
            url: "/Home/PopulateEmailAddressUI",
            data: {clientID:id},
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            success: function (data) {
                // Variable data contains the data you get from the action method
            }
        });
    });})

数据中的参数名称应如控制器参数名称

【讨论】:

  • 对不起,没用。我的 Action 方法如下所示: public ActionResult PopulateEmailAddressUI(string clientID) {} 和 clientID 为 null。
  • 然后写入:data:{clientID:id}
  • 再次感谢您,但仍然为空:(
  • delete this string contentType: 'application/json; charset=utf-8' 如果没有帮助,请看,下拉菜单中可能包含空值:
【解决方案3】:

这是完整的 WORKING jQuery 脚本:

jQuery(document).ready(function () {
    $("#MeditechDropDown").change(function () {
        var id = $(this).find(":selected").val()
        var clientID = { "clientID" : id }
        console.log(id)
        $.ajax({
            url: "/Home/PopulateEmailAddressUI",
            data: JSON.stringify(clientID),
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            success: function (data) {
                // Variable data contains the data you get from the action method
            }
        });
    });
});

谢谢大家,特别感谢zgood :)

【讨论】:

  • 在这种情况下,我必须创建一个名为 clientID 的对象。在那个对象中,我必须使用符号 { "clientID" : id },这里的 clientID 是指传递给我的 Action 方法的字符串参数。然后我做了一个 JSON.stringify 那个对象,我得到了结果。
  • 这是一个非常可靠的原因 - 它非常易读。在生产代码中注意console.log,因为早期版本的 IE 不知道它是什么,它会导致你的脚本无法在那些糟糕的浏览器中运行;)
  • 发布后去掉了console.log :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多