ASP.NET MVC 3 динамическая генерация форм - PullRequest
2 голосов
/ 02 апреля 2012

Я пытаюсь создать форму во время выполнения.Я закончил с этим подходом

@using (Html.BeginForm()) {
    @foreach (var propertyInfo in typeof(MvcApplication1.Models.LogOnModel).GetProperties()) {
        if (propertyInfo.PropertyType == typeof(Boolean)) {
            Html.CheckBoxFor(m => new PropertyWrapper<Boolean>(propertyInfo, Model).Property);
        }
        else if (propertyInfo.PropertyType == typeof(String)) {
            Html.TextBoxFor(m => new PropertyWrapper<String>(propertyInfo, Model).Property);
        }
        ...
    }
}

С этим классом, чтобы позволить методам [ElementType]For() работать (им нужна ссылка на свойство, которое не может быть получено с помощью отражения).

public class PropertyWrapper<T> {
    private PropertyInfo _propertyInfo;
    private Object _instance;

    public PropertyWrapper(PropertyInfo propertyInfo, Object instance) {
        _propertyInfo = propertyInfo;
        _instance = instance;
    }

    public T Property {
        get { return (T)_propertyInfo.GetValue(_instance, null); }
        set { _propertyInfo.SetValue(_instance, value, null); }
    }
}

Я получаю следующую ошибку

System.Reflection.TargetException: Non-static method requires a target.

, потому что instance параметр конструктора PropertyWrapper равен нулю.Я что-то пропустил?Это вообще возможно?

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

Забудьте о строгой типизации, XXX для помощников и лямбда-выражений.После того, как вы запустите игру Reflection, вы должны играть в нее до конца.

Помощники XXXFor работают с очень простыми выражениями, такими как доступ к свойствам.

m => new PropertyWrapper<String>(propertyInfo, Model).Property намного превышает возможности этих помощников.

1 голос
/ 02 апреля 2012

Почему бы не использовать не "для" методы? @Html.CheckBox() например. Просто передайте имя свойства методу, и привязка модели все равно будет работать после обратной передачи

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