是否可以从查询字符串中获取字典?

时间:2014-03-28 08:39:20

标签: c# asp.net-mvc-4 query-string

我的控制器方法如下所示:

public ActionResult SomeMethod(Dictionary<int, string> model)
{

}

是否可以调用此方法并仅使用查询字符串填充“模型”?我的意思是,输入这样的东西:

ControllerName/SomeMethod?model.0=someText&model.1=someOtherText

在我们的浏览器地址栏中。有可能吗?

编辑:

看来我的问题被误解了 - 我想绑定查询字符串,以便自动填充Dictionary方法参数。换句话说 - 我不想在我的方法中手动创建字典,但是有一些自动化的.NET绑定器来形成我,所以我可以像这样立即访问它:

public ActionResult SomeMethod(Dictionary<int, string> model)
{
    var a = model[SomeKey];
}

是否有自动绑定器,足够聪明地执行此操作?

5 个答案:

答案 0 :(得分:3)

在ASP.NET Core中,您可以使用以下语法(无需自定义绑定器):

?dictionaryVariableName[KEY]=VALUE

假设你有这个方法:

public ActionResult SomeMethod([FromQuery] Dictionary<int, string> model)

然后调用以下网址:

?model[0]=firstString&model[1]=secondString

然后会自动填充您的字典。使用值:

(0, "firstString")
(1, "secondString")

答案 1 :(得分:2)

尝试自定义模型绑定器

      public class QueryStringToDictionaryBinder: IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var collection = controllerContext.HttpContext.Request.QueryString;
        var modelKeys =
            collection.AllKeys.Where(
                m => m.StartsWith(bindingContext.ModelName));
        var dictionary = new Dictionary<int, string>();

        foreach (string key in modelKeys)
        {
            var splits = key.Split(new[]{'.'}, StringSplitOptions.RemoveEmptyEntries);
            int nummericKey = -1;
            if(splits.Count() > 1)
            {
                var tempKey = splits[1]; 
                if(int.TryParse(tempKey, out nummericKey))
                {
                    dictionary.Add(nummericKey, collection[key]);    
                }   
            }                 
        }

        return dictionary;
    }
}
控制器动作中的

在模型上使用它

     public ActionResult SomeMethod(
        [ModelBinder(typeof(QueryStringToDictionaryBinder))]
        Dictionary<int, string> model)
    {

        //return Content("Test");
    }

答案 2 :(得分:2)

对于.NET Core 2.1,您可以非常轻松地做到这一点。

public class SomeController : ControllerBase
{
    public IActionResult Method([FromQuery]IDictionary<int, string> query)
    {
        // Do something
    }
}

和网址

/Some/Method?1=value1&2=value2&3=value3

它将绑定到字典。您甚至不必使用参数名称查询。

答案 3 :(得分:1)

更具体的mvc模型绑定是将查询字符串构造为

/模型的someMethod [0]。重点= 1&安培;模型[0]。价值=一个&安培;模型[1]。重点= 2及模型[1]。价值=两个

Custom Binder只会遵循DefaultModelBinder

   public class QueryStringToDictionary<TKey, TValue> : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var modelBindingContext = new ModelBindingContext
        {

            ModelName = bindingContext.ModelName,
            ModelMetadata = new ModelMetadata(new EmptyModelMetadataProvider(), null, 
                null, typeof(Dictionary<TKey, TValue>), bindingContext.ModelName),
            ValueProvider = new QueryStringValueProvider(controllerContext)
        };

        var temp = new DefaultModelBinder().BindModel(controllerContext, modelBindingContext);

        return temp;
    }
}

在模型中应用自定义模型绑定器

     public ActionResult SomeMethod(
        [ModelBinder(typeof(QueryStringToDictionary<int, string>))] Dictionary<int, string> model)
    {
       // var a = model[SomeKey];
        return Content("Test");
    }

答案 4 :(得分:-1)

使用HttpUtility.ParseQueryString()

看看这是关于Parsing query string without regex in C#

的一个很好的例子