Использование asp.net mvc связывателей моделей в общем - PullRequest
2 голосов
/ 14 ноября 2009

У меня есть иерархия классов, которые все наследуются от базового типа, а базовый тип также реализует интерфейс. То, что я хочу сделать, - это иметь один контроллер для управления всей иерархией (поскольку действия, предоставляемые через контроллер, идентичны). При этом я хочу, чтобы в представлениях были поля, относящиеся к типу, и привязка модели для привязки к скрытому значению поля. что-то вроде:

<input type="text" name="model.DerivedTypeSpecificField" />
<input type="hidden" name="modelType" value="MyDerivedType" />

При этом для связывателей модели asp.net mvc, по-видимому, требуется конкретный тип, который они будут создавать, по этой причине мне потребуется создать отдельный контроллер для каждого производного типа.

Кто-нибудь делал это раньше или знает, как манипулировать связывателем модели, чтобы вести себя таким образом? Я мог бы написать свой собственный механизм связывания модели, но я не хочу, чтобы что-то выходило за рамки базового поведения привязки модели свойств назначения и создания массивов для целевого типа.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 14 ноября 2009

Не знаю, сработает ли это, но вы можете попробовать что-то вроде:

public class MyBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        bindingContext.ModelType = System.Type.GetType(controllerContext.HttpContext.Request["modelType"]);

        return base.BindModel(controllerContext, bindingContext);
    }
}

Это просто простая замена подшивки базовой модели.

2 голосов
/ 11 мая 2010

Проверьте модель связывателя производного типа в MvcContrib. Это позволяет вам связывать модели с производными типами посредством процесса «маркировки типов», который обрабатывается автоматически при использовании помощника RenderTypedPartial (...). Частицы MvcContrib поддерживают состояние привязки между частями, поэтому префиксы Name / Id должным образом поддерживаются в глубоком объектном графе. Если вы используете другие механизмы, такие как шаблоны, то вам придется обрабатывать метки самостоятельно. Это объясняется на странице документации.

Возвращаясь к вашим вопросам и способам разрешения производных типов с помощью ModelBinder, вы можете зарегистрировать варианты производных типов с атрибутами в механизме, аналогичном WCF KnownTypeAttribute, или вы можете выполнить регистрацию при запуске. В любом случае, эти изменения регистрируются один раз и сохраняются для повышения производительности.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...