Я считаю, что связываюсь с knockoutjs. Мне нужно динамически добавлять данные в список в модели просмотра с помощью сообщения ajax.

            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) {
}

Значение имени передается, но модель всегда равна нулю

Я пробовал это:

            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;
                }
            });

Мой ModelBinder

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);
    }
}

Может кто подскажет как это исправить?

0
capiono 21 Апр 2016 в 13:18

2 ответа

Лучший ответ

Похоже, вы не передаете в полезную нагрузку точно такой же объект.

Допустим, ваш объект модели выглядит так:

{
   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;
            }
        });
1
Carlos Fernández 21 Апр 2016 в 13:06

Попробуй это:

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) { ... }
});
0
Neps 21 Апр 2016 в 15:55