3

我最近将我的项目从 MVC3 升级到 MVC4,从那时起,我的一些操作参数被错误地传递。

该操作具有以下签名:

public JsonResult FooAction(int id, int id2, string name, string name2, List<Object1> templates, Dictionary<string, string> dictionary1, Dictionary<string, List<string>> dictionary2);

如果 JSON 调用传递一个空数组:

"dictionary2":[]

然后dictionary2设置为路线:

{key = "controller", value = "MyController"}
{key = "action", value = "MyAction"}
{key = "id", value = "123123"}

显然我希望它只是一本空字典 - 有什么办法可以防止这种行为吗?

[编辑] 我应该提到我正在使用默认路由行为:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = "" } 
);
4

1 回答 1

0

我设法通过[Bind(Prefix = "dictionary2")]在参数定义之前添加来获得所需的行为,即

public JsonResult FooAction(int id, int id2, string name, string name2, List<Object1> templates, Dictionary<string, string> dictionary1, [Bind(Prefix = "dictionary2")] Dictionary<string, List<string>> dictionary2);

但它也打败了我。

或者其他方式,通过实现自己的ModelBinder

public class StringDictionaryModelBinderProvider: IModelBinderProvider
{
    public IModelBinder GetBinder(Type modelType)
    {
        if (modelType == typeof (Dictionary<string, string>) || modelType == typeof (IDictionary<string, string>))
            return new StringDictionaryModelBinder();

        return null;
    }

    private class StringDictionaryModelBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            bindingContext.FallbackToEmptyPrefix = false;
            return base.BindModel(controllerContext, bindingContext);
        }
    }
}

并在应用程序启动中:

ModelBinderProviders.BinderProviders.Add(new StringDictionaryModelBinderProvider());

但是还是打不过我。

于 2013-06-20T15:20:53.877 回答