C# MVC4/AJAX-尽管列表中的条目有效,但仍将空值传递给控制器

C# MVC4/AJAX-尽管列表中的条目有效,但仍将空值传递给控制器,c#,ajax,asp.net-mvc,json,asp.net-mvc-4,C#,Ajax,Asp.net Mvc,Json,Asp.net Mvc 4,我有一个正在创建的表单。其中两个字段是OriginarPortid和DestinationAirportID 目前可以做的是,有人在该字段中键入一个字母字符串,然后页面使用该字符串创建一个AJAX请求,以获取JSON格式的一组数据。然后,这个JSON数据被格式化并显示在页面上,用户可以在页面上单击它,并将项目名称添加到字段中 按下submit/create按钮,我已经在VisualStudio中对此进行了调试,可以看到FromAirport和ToAirport字段显示为null 很明显,机场id

我有一个正在创建的表单。其中两个字段是OriginarPortid和DestinationAirportID

目前可以做的是,有人在该字段中键入一个字母字符串,然后页面使用该字符串创建一个AJAX请求,以获取JSON格式的一组数据。然后,这个JSON数据被格式化并显示在页面上,用户可以在页面上单击它,并将项目名称添加到字段中

按下submit/create按钮,我已经在VisualStudio中对此进行了调试,可以看到FromAirport和ToAirport字段显示为null

很明显,机场id没有发送回管制员,因此模型验证失败

这样做的原因,而不是dropdownlist,是因为加载页面变得沉重,尤其是在数据库中的两个字段上有50000个机场,总共有100000个选择项

字段的HTML标记为:

        <input type="text" name="OriginAirportID" id="OriginAirportID" />

        <input type="text" name="DestinationAirportID" id="DestinationAirportID" />
以下是回应:

        [{"AirportID":16420,"Name":"London Heathrow Airport"}]
在my$.ajax中,如下所示:

                $.ajax({
                    url: "/Flight/<MethodName>",
                    type: "POST",
                    dataType: "json",
                    data: { term: request.term },
                    success: function (data) {
                        response($.map(data, function (item) {
                            return { label: item.Name, value: item.Name };
                        }))

                    }
                })
让我知道,如果这是不清楚或混乱,我会尝试提供更多的信息

编辑:格林威治时间4/12/14 1844


感谢您到目前为止对这个看起来像js对象的模型以及隐藏字段技术的三个回应。我将对每一个建议进行修改,看看它是否最终接受了这个模型。StuartLC-我想我认为它很聪明,但我刚刚意识到你指出的代码没有Airport什么的!这肯定会使问题更加复杂。

问题似乎是您使用模型中的实际属性作为用户输入文本的字段,但看起来这些属性实际上应该是int。一旦modelbinder开始处理发布的数据,它将尝试将字符串值绑定到int,但由于类似LHR的内容无法转换为int,因此您将得到null。你应该做的是:

<input type="text" id="OriginAirport" />
<input type="hidden" name="OriginAirportID" />

用户在文本框中键入,该文本框不绑定任何内容。AJAX使用它来查找机场id,然后使用它设置绑定到实际属性的隐藏输入。现在,当您发布时,实际的整数id将被发布,modelbinder将能够将其正确绑定到您的模型。

这就是我要做的:

1根据用户输入,进行AJAX调用并获取机场ID和其他数据。您可以将机场ID保存在隐藏字段中或作为输入字段的数据属性。这没什么大区别,两种选择都可以。假设您使用的是隐藏字段

2目的地机场也一样

现在有两个隐藏字段,一个用于原点,另一个用于目标

3用户提交:在AJAX调用中,您创建了一个JS对象,并设置了源ID和目标ID

var vm = {};
vm.originAirportId = $("#OriginAirportID").val();
vm.destinationAirportId = $("#DestinationAirportID").val();
4在ASP.NET MVC操作中,您应该有一个与JS对象具有相同属性的ViewModel,如下所述

public class TripVM {
     public int OriginAirportId { get; set; }
     public int DestinationAirportId { get; set; }
}
然后,ASP.NET MVC将为您进行绑定

这样,您只需将ID从客户端发送到服务器。我建议您使用JSON.stringify将JS对象转换为JSON表示。
请记住,JS对象的属性名称必须与C类的属性匹配,但比较不区分大小写,因此您可以遵守每种语言的命名约定:

当然,您还需要保留Ajax调用返回的AirportID,因为这是表单发布时在OriginAirportID/DestinationAirportID输入中最终设置的内容,例如返回{id:item.AirportID,label:item.Name,value:item.Name};等等?嗨,克里斯,我终于有机会尝试一下了,效果不错!谢谢。
public class TripVM {
     public int OriginAirportId { get; set; }
     public int DestinationAirportId { get; set; }
}