Re[3]: Создание объект средствами MVC Default Model Binding
От: curt_russel  
Дата: 14.06.13 13:45
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Здравствуйте, pavel783, Вы писали:


P>> или еще в утилите Reflector есть плагин filedisasembler — можно исходники dmb выдрать и заменить в них httpcontext и иже с ним входные данные на более абстрактные данные, dmb тогда будет более универсальным...


Doc>А можно не заниматься ерундой и сделать декоратор. Ну а если сильно хочется сорцы, то опять же не возиться с Reflector. ASP.NET уже давно OpenSource. Вот этот биндер (и прочие сорцы там же на http://aspnetwebstack.codeplex.com)


Doc>http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/DefaultModelBinder.cs



Спасибо большое за советы!
Кому интересно, решение этой задачи:


private void Run()
{
    var dictionary = {параметры из БД}.ToDictionary(vmv => vmv.ParameterName,vmv => vmv => vmv.ParameterValue);

    var dictionaryValueProvider = new DictionaryValueProvider<object>(dictionary, CultureInfo.CurrentCulture);
    GenerateModel(ctrl.ModelName, dictionaryValueProvider);
}

private object GenerateModel(string modelName, DictionaryValueProvider<object> dictionaryValueProvider)
{
    var type = Type.GetType(modelName, false, true);
    var model = Activator.CreateInstance(type);

    CmsTryUpdateModel(model, dictionaryValueProvider);
    return model;
}

protected internal bool CmsTryUpdateModel<TModel>( TModel model, IValueProvider valueProvider ) where TModel : class
{
    if (model == null)
    {
        throw new ArgumentNullException("model");
    }
    if (valueProvider == null)
    {
        throw new ArgumentNullException("valueProvider");
    }

    Predicate<string> propertyFilter = propertyName => new BindAttribute().IsPropertyAllowed(propertyName);
    IModelBinder binder = Binders.GetBinder(typeof(TModel));

    var bindingContext = new ModelBindingContext() {
        // in the original method you have:
        // ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, typeof(TModel)),
        ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, model.GetType()),  // нужно GetType, т.к. тип известен только в runtime
        ModelName = null,
        ModelState = ModelState,
        PropertyFilter = propertyFilter,
        ValueProvider = valueProvider
    };
    binder.BindModel(ControllerContext, bindingContext);
    return ModelState.IsValid;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.