Mvc6 пользовательские модели скоросшивателя не стреляют
Я пытаюсь выяснить привязку модели в текущем mvc6 (кандидат на выпуск Visual Studio 2015). Вот как выглядит мой код:
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);
}
}
Регистрация в автозагрузке.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().Configure<MvcOptions>(options =>
{
options.ModelBinders.Add(typeof( MyObjectModelBinder));
});
}
Мой контроллер:
[HttpPost]
public void ReceiveMyObject([FromBody] MyObject x)
{
}
Меня пока не волнует фактическое создание объекта из входных данных. Меня беспокоит то, что при отладке я вижу, что контроллер запускается (при значении x, равном нулю), но функция связывания не вызывается. Есть идеи, что здесь не так?
[РЕДАКТИРОВАТЬ: Это уже было обновлено] Также обратите внимание, я уже видел, Как правильно создавать привязки пользовательских моделей в MVC6? но ответ в этом посте является либо неправильным, либо устаревшим, так как приведенный пример не реализует текущий IModelBinder.
Спасибо
РЕДАКТИРОВАТЬ: Это код 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) }
});
}
3 ответа
Добавлять
public void ReceiveMyObject([ModelBinder(BinderType = typeof(MyObjectModelBinder))] MyObject x)
метод или вы можете установить связыватель по умолчанию для типа
Попробуйте добавить его в качестве первой связующей модели в список. Когда IModelBinder
успешно устанавливает модель, другой IModelBinder
не будет уволен.
Так что если вы хотите дать шанс своему собственному IModelBinder
Вы должны сделать это уволенным прежде, чем другие сделают работу.
Это работает для меня:
services.Configure<MvcOptions>(options =>
{
options.ModelBinders.Insert(0, new MyObjectModelBinder());
});
Но индекс 0
это не лучшее место, чтобы поставить его. Просто определите, какой ModelBinder устанавливает модель и предотвращает запуск вашего ModelBinder, и поместите ваш ModelBinder перед ним.
Удалить [FromBody]
оформление по параметру действия.
FromBody
указано, что InputFormatter
должен использоваться для заполнения этого параметра. Если вы удалите его, модель связующих запустится.