【问题标题】:Pass multiple parameters from ajax post to asp.net mvc controller将多个参数从 ajax post 传递到 asp.net mvc 控制器
【发布时间】: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 可以,但我不想将它作为查询字符串传递,因为在某些情况下,我可能传递多达六个参数。

标签: c# jquery ajax asp.net-mvc knockout.js


【解决方案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) { ... }
    });
    

    【讨论】:

      猜你喜欢
      • 2015-04-03
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2013-12-10
      • 2021-08-27
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      相关资源
      最近更新 更多