之后在ASP.NET MVC中进行模型绑定:如何将QueryString值转换为视图模型? [英] Afterwards Model Binding in ASP.NET MVC: How to convert QueryString values into a view model?

查看:149
本文介绍了之后在ASP.NET MVC中进行模型绑定:如何将QueryString值转换为视图模型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个没有参数的动作方法.

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);
}

问题是UpdateModelTryUpdateModel不适用于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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆