将多个参数从 ajax post 传递到 asp.net mvc 控制器
Posted
技术标签:
【中文标题】将多个参数从 ajax post 传递到 asp.net mvc 控制器【英文标题】:Pass multiple parameters from ajax post to asp.net mvc controller 【发布时间】:2016-08-14 11:28:29 【问题描述】:我认为我正在与 knockoutjs 绑定。我需要使用 ajax post 将数据动态添加到视图模型中的列表中。
var data =
model: ko.toJS(self.Model),
name: name
$.ajax(
url: options.url + "AddAdvantage",
type: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify(data),
traditional: true,
success: function (data)
self.UpdateOnChange = false;
ko.mapping.fromJS(data, self.Model);
self.UpdateOnChange = true;
);
当数据参数传递给控制器动作时:
[HttpPost]
public JsonResult AddAdvantage([ModelBinder(typeof(AdvantageModelBinder))] AdvantageViewModel model, string name)
name 值已传递,但模型始终为空
我试过这个:
var data =
model: ko.toJSON(self.Model),
name: name
也试过了:
var data = JSON.stringify(
model: ko.toJSON(self.Model),
name: name
);
同样的结果。
这很好用:
$.ajax(
url: options.url + "AddAdvantage",
type: 'POST',
dataType: 'json',
contentType: 'application/json',
data: ko.toJSON(self.Model),
traditional: true,
success: function (data)
self.UpdateOnChange = false;
ko.mapping.fromJS(data, self.Model);
self.UpdateOnChange = true;
);
我的模型绑定器
public class AdvantageModelBinder: DefaultModelBinder
public AdvantageModelBinder()
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
ValueProviderResult value = bindingContext.ValueProvider.GetValue("WizardType");
Type typeByTypeName = AdvantageModelBinder.GetTypeByTypeName((string)value.ConvertTo(typeof(string)));
object obj = Activator.CreateInstance(typeByTypeName);
bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => obj, typeByTypeName);
return obj;
public static Type GetTypeByTypeName(string typeName)
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
for (int i = 0; i < (int)assemblies.Length; i++)
Type type = assemblies[i].GetType(typeName, false, true);
if (type != null)
return type;
throw new ArgumentException("Can't find the specified type in the loaded assemblies.", typeName);
谁能告诉我如何解决这个问题?
【问题讨论】:
ko.toJS(self.Model)的值是js对象吗? 您是否尝试调试过AdvantageModelBinder
?还有你为什么在AdvantageModelBinder
里面打电话给WizardModelBinder
我没有调用 WizardModelBinder,这是一个粘贴错误。
如果 ko.toJS(self.Model) 是 js 对象,那么试试这个 - var data = ko.toJS(self.Model);使用这个网址 - options.url + "AddAdvantage?name="name
是的,Karthik 可以,但我不想将它作为查询字符串传递,因为在某些情况下,我可能传递多达六个参数。
【参考方案1】:
您似乎没有在有效负载中传递完全相同的对象。
假设你的模型对象是这样的:
foo: 1,
bar: 2
在前两个示例中,您正在创建此对象:
model:
foo: 1,
bar: 2
,
name: "whatever"
因此,当您将它作为参数传递给 ajax 调用时,您传递的是 MVC 端不期望的对象。
如果要将其存储在变量中,则需要执行以下操作:
var data = ko.toJSON(self.model)
然后进行 ajax 调用:
$.ajax(
url: options.url + "AddAdvantage",
type: 'POST',
dataType: 'json',
contentType: 'application/json',
data: data,
traditional: true,
success: function (data)
self.UpdateOnChange = false;
ko.mapping.fromJS(data, self.Model);
self.UpdateOnChange = true;
);
【讨论】:
【参考方案2】:试试这个:
var data =
model: self.Model,
name: name
$.ajax(
url: options.url + "AddAdvantage",
type: 'POST',
dataType: 'json',
contentType: 'application/json',
data: ko.toJSON(data),
traditional: true,
success: function (data) ...
);
【讨论】:
以上是关于将多个参数从 ajax post 传递到 asp.net mvc 控制器的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC 3 - 通过ajax无法正常传递额外参数以及模型到操作
JQuery中$.ajax()方法参数详解 ASP.NET jquery ajax传递参数