将多个参数从 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 控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个参数从 ajax 调用传递到 MVC 控制器

ASP.NET MVC 3 - 通过ajax无法正常传递额外参数以及模型到操作

JQuery中$.ajax()方法参数详解 ASP.NET jquery ajax传递参数

asp.net mvc怎样传递多个url参数

通过 AJAX POST 请求(IIS 7、ASP.NET MVC 4)向服务器传递大文件时出错

struts2怎样获取AJAX post请求传递的数据