从ActionParameters中检索复杂对象

And*_*NET 6 action-filter asp.net-mvc-3

我正在开发一个MVC项目,其中控制器操作处理资产.不同的控制器以不同的方式接受assetId参数:一些控制器只使用复杂对象(包含保存assetId的属性)获取int assetId,使用其他控制器int id和其他控制器AssetDTO dto

我正在编写一个ActionFilter,它被添加到action方法中,并提供了actionParameter名称,我可以在其中获取资产值.

行动方法:

    [AssetIdFilter("assetId")]
    public ActionResult Index(int assetId)
    {
            ...
    }
Run Code Online (Sandbox Code Playgroud)

该属性定义为:

public class AssetIdFilterAttribute : ActionFilterAttribute
{
    public string _assetIdParameterKey { get; set; }

    public AssetIdFilterAttribute (string assetIdParameterKey)
    {
        _assetIdParameterKey = assetIdParameterKey;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        int assetId;
        if (Int32.TryParse(filterContext.ActionParameters[_assetIdParameterKey].ToString(), out assetId))
        {
                    ......
        }
    }
Run Code Online (Sandbox Code Playgroud)

这可以按预期工作,但只有在assetId作为基元提供时才有效.我不确定当在一个复杂的对象中将assetId提供给action方法时该怎么办.

我是否需要根据类型对每个对象进行不同的解析?我希望我可以在AssetIdFilter中指定某种点符号来告诉它assetId的位置:dto.assetId

我可以用任何方式动态吗?还是反思?等.???

Beh*_*ili 7

在这里动态来救援.你可以将actionFilterAttribute更改为:

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            dynamic assetIdHolder = filterContext.ActionParameters[_assetIdParameterKey];
            if (assetIdHolder.GetType().IsPrimitive)
            {
                //do whatever with assetIdHolder              
            }
            else
            {
                //do whatever with assetIdHolder.assetId
            }
        }
Run Code Online (Sandbox Code Playgroud)

干杯!