3

Я пытаюсь выяснить привязку модели к текущему mvc6 (кандидат на выпускной студии 2015 года). Это то, что мой код выглядит так далеко:mvc6 обычная модель связующего не обжига

public class MyObjectModelBinder : IModelBinder 
{ 
    public Task<ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext) 
    { 

     if (bindingContext.ModelType == typeof(MyObject)) 
     { 
      var model = new MyObject(); 
      return Task.FromResult(new ModelBindingResult(model, bindingContext.ModelName, true)); 
     } 
     return Task.FromResult<ModelBindingResult>(null); 

    } 
} 

Регистрация в startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc().Configure<MvcOptions>(options => 
    { 
     options.ModelBinders.Add(typeof(MyObjectModelBinder)); 
    }); 
} 

Мой контроллер:

[HttpPost] 
public void ReceiveMyObject([FromBody] MyObject x) 
{ 

} 

Я еще не заботиться о создании на самом деле объект со входа, что меня беспокоит, так это то, что когда я отлаживаю, я вижу, что стрелка контроллера (с x равна нулю), но функция связывания не вызывается. Какие-нибудь идеи о том, что здесь не так?

[EDIT: это уже обновлено] Также обратите внимание, что я уже видел What is the correct way to create custom model binders in MVC6?, но ответ в этом сообщении либо неправильный, либо устаревший, поскольку приведенный пример не реализует текущий IModelBinder.

Благодаря

EDIT: Это Javascript код, который используется, чтобы запустить контроллер:

function sendMessage(i) { 
    $.ajax({ 
     type: 'POST', 
     url: 'myurl', 
     data: data, 
     contentType: 'application/x-www-form-urlencoded', 
     dataType: 'json', 
     success: function (data) { console.log(data) } 
    }); 
} 

ответ

1

Снимите [FromBody] украшение на параметре действия пользователя.

FromBody указано, что для заполнения этого параметра используется InputFormatter. Если вы удалите его, то перейдут на перенос модели.

+0

Если я уберу его, контроллер больше не срабатывает. Однако, если параметр отсутствует. Я прикрепил javascript, который я использую для тестирования, но в реальном случае вызов выполняется внешним программным обеспечением, поэтому я не могу его изменить. – Plaga

2

Добавить

public void ReceiveMyObject([ModelBinder(BinderType = typeof(MyObjectModelBinder))] MyObject x) 

методу или и можно установить по умолчанию связующее для типа

1

Try, чтобы добавить его в качестве первой модели связующего в список. Когда IModelBinder успешно устанавливает модель, другие IModelBinder не будут уволены.

Поэтому, если вы хотите дать шанс своему собственному IModelBinder, вы должны сделать его уволенным, прежде чем другие сделают эту работу.

Это работает для меня:

services.Configure<MvcOptions>(options => 
{ 
    options.ModelBinders.Insert(0, new MyObjectModelBinder()); 
}); 

Но индекс 0 не самое лучшее место, чтобы поставить его. Просто определите, какой ModelBinder устанавливает модель и предотвращает запуск вашего ModelBinder и помещает ваш ModelBinder перед этим.

 Смежные вопросы

  • Нет связанных вопросов^_^