之后在ASP.NET MVC中进行模型绑定:如何将QueryString值转换为视图模型? [英] Afterwards Model Binding in ASP.NET MVC: How to convert QueryString values into a view model?
问题描述
我有一个没有参数的动作方法.
I have an action method without parameters.
QueryString
集合包含我所有的值. QueryString
的键与我的视图模型属性匹配.
The QueryString
collection contain all of my values. The keys of the QueryString
match my view model properties.
var queryStringValueProvider = new QueryStringValueProvider(ControllerContext);
var providerResult = queryStringValueProvider.GetValue(ValidationKeys.Id); // ?!
var viewModelTypeName = queryString[ValidationKeys.ViewModelType];
var viewModelType = Type.GetType(viewModelTypeName);
var viewModelInstance = providerResult.ConvertTo(viewModelType); // throws an InvalidOperationException
如何将QueryString
集合转换为视图模型?
当您仅将视图模型传递给操作方法参数时,ASP.NET MVC已经做到了.因此,我需要使用ASP.NET MVC机制的事后模型绑定.
How can I convert the QueryString
collection to a view model?
ASP.NET MVC already do this when you just pass the view model into the action method parameters. So what I need is an afterwards model binding using ASP.NET MVC mechanics.
推荐答案
我的控制器操作
var viewModelTypeName = queryString[ValidationKeys.ViewModelType];
var viewModelType = Type.GetType(viewModelTypeName);
var instance = Activator.CreateInstance(viewModelType);
UpdateModelUsingQueryString(instance);
UpdateModel
protected internal void UpdateModelUsingQueryString<TModel>(TModel model) where TModel : class
{
if (model == null) throw new ArgumentNullException("model");
Predicate<string> propertyFilter = propertyName => new BindAttribute().IsPropertyAllowed(propertyName);
var binder = Binders.GetBinder(typeof(TModel));
var bindingContext = new ModelBindingContext()
{
ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, model.GetType()),
ModelState = ModelState,
PropertyFilter = propertyFilter,
ValueProvider = new QueryStringValueProvider(ControllerContext)
};
binder.BindModel(ControllerContext, bindingContext);
}
问题是UpdateModel
或TryUpdateModel
不适用于object
.
两种方法都使用typeof(TModel)
.但是您必须使用model.GetType()
.
The problem was that UpdateModel
or TryUpdateModel
does not work for object
by design.
Both methods use typeof(TModel)
. But you have to use model.GetType()
.
看看:模型绑定-键入外部程序集
Darin Dimitrov给出了正确答案:)
Darin Dimitrov gave the right answer :)
这篇关于之后在ASP.NET MVC中进行模型绑定:如何将QueryString值转换为视图模型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!