2014-11-11 2 views
1

У меня есть модель со следующими свойствами:MVC модель привязки возврата Массивы для объектов

public class MyModel{ 

    public object Name{get;set;} 

} 

Имя свойства визуализируется как текстовое поле на форму MVC. Когда форма MVC отправлена, свойство Name задается с типом Array [String] с длиной 1 и моим значением в нем. Почему связующее устройство модели создает массив, а не просто устанавливает свойство для строкового объекта?

К сожалению, я не могу изменить тип возвращаемого свойства, потому что это свойство находится в третьей части кода.

Некоторые подробнее:

У нас есть два сайта, один сайт связывает свойство в виде строки другой сайт связывает его как массив [String]. Глядя на трассировку стека, оба события привязки проходят через связующее устройство по умолчанию. Итак, проблема у нас в том, что отличается от нашей первой среды для нашей второй? Оба используют одни и те же версии сборки и конфигурации.

+0

Вы можете показать ваш 'View'? –

+2

Это, вероятно, просто поведение DefaultModelBinder. Возможно, вы можете настроить его, внедряя свой собственный IModelBinder, который делает то, что вы хотите для свойств модели объекта типа. – Rudism

+0

После дальнейшего расследования (много декомпиляции и ругательства) мы обнаружили, что в стороннем коде есть контейнер DI, который не разрешает корректное полевое связующее. Спасибо тем, кто прочитал и прокомментировал этот вопрос. –

ответ

3

Вы можете переопределить поведение связующего устройства по умолчанию следующим образом. Пользовательское связывание модели дает вам возможность изменять формы объектов по умолчанию по типу по вашему выбору.

Как вы хотите, чтобы объект был изменен на тип строки. Сначала нужно написать реализацию по вашему выбору, в которой помогает IModelBinder.

public class CustomBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
    HttpRequestBase request = controllerContext.HttpContext.Request; 
    string name = request.Form.Get("Name");  
    return name 
    } 
} 

Затем мы приложим приложение Application_Start() перед отправкой данных, необходимых для его регистрации. Добавляя определения для модели связующего в Application_Start()

ModelBinders.Binders.Add(typeof(MyModel), new CustomBinder()); 

Затем использовать пользовательские привязки на сообщение метод, при котором вы получите формы данные

public ActionResult Index([ModelBinder(typeof(CustomBinder))] MyModel model) 
Смежные вопросы