gpt4 book ai didi

c#-4.0 - 从 ASP.NET MVC 3 升级到 MVC 4,参数被替换为路由

转载 作者:行者123 更新时间:2023-12-05 01:13:56 27 4
gpt4 key购买 nike

我最近将我的项目从 MVC3 升级到 MVC4,从那时起,我的一些操作参数传递不正确。

这个 Action 有这个签名:

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

最佳答案

我设法通过在参数定义之前添加 [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());

但还是打败了我。

关于c#-4.0 - 从 ASP.NET MVC 3 升级到 MVC 4,参数被替换为路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12280017/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com