繁体   English   中英

使用$ .ajax(MVC 4)将数据传递给控制器

[英]Passing data to a controller with $.ajax (MVC 4)

我有以下编辑器模板:

DropDownListEditorTemplate

@model DropDownListViewModel

<script type="text/javascript">
    $(function() {
        $("select").on("change", function () {
            $.ajax({
                type: "POST",
                url: '@Url.Action("ListItemChanged", "Controller")',
                data: { "Value": "@Model.Items.FirstOrDefault(x => x.Selected).Value" }
            });
        });
    })
</script>

@Html.DropDownListFor(m => m.Value, Model.Items, "(Select)")

调节器

public ActionResult ListItemChanged(string selectedItem)
{
    // Stuff.
}

问题是当加载编辑器模板时,我得到一个错误,说@ Model.Items为null(“对象引用未设置为对象的实例”)。 这是有道理的,除了为什么在没有任何选择项目改变的情况下评估该行? 即使我将$ .ajax调用更改为仅在1 == 2时执行,它仍然会给我错误。 很明显,即使jQuery函数没有执行,也会对该行进行评估。

鉴于此,我该如何防止发生错误? @ Model.Items.First(x => x.Selected).Value只有在选择了下拉列表项后才会有值。

尝试这个:

@model DropDownListViewModel

<script type="text/javascript">
    $(function() {
        $("select").on("change", function () {
            $.ajax({
                type: "POST",
                url: '@Url.Action("ListItemChanged", "Controller")',
                data: { "Value": $(this).val() }
            });
        });
    })
</script>

@Html.DropDownListFor(m => m.Value, Model.Items, "(Select)")

您必须了解的是,@expressions在服务器内进行了解析。 您还必须了解MVC模型绑定器根据其名称区分字段。 在jquery ajax函数的数据对象内部,您传递对象文字,您必须指定变量的名称,就像您的操作方法所期望的那样( 在您的情况下,为selectedItem )。 所以正确的方法应该是:

$("select").on('change', function () {
      $.ajax({
            type: 'POST',
            url: '@Url.Action("ListItemChanged", "Controller")',
            data: { "selectedItem": $(this).val() }
      });
});

//Server
[HttpPost]
public ActionResult ListItemChanged(string selectedItem)
{
    // Stuff.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM