2014-03-28 58 views
3

我控制器的方法是这样的:是否有可能从查询字符串中获取字典?

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

} 

是否有可能调用此方法并填充“模式”仅使用查询字符串?我的意思是,打字如下:

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

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

编辑:

这样看来,我的问题被误解了 - 我想查询字符串绑定,从而使字典方法的参数自动填充。换句话说 - 我不想手动创建我的方法里面的字典,但有一些automathic .NET粘结剂做到这一点构成了我,这样我就可以访问它马上像这样:

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

是否有自动粘合剂,足够聪明地做到这一点?

+0

看看这个:http://stackoverflow.com/questions/2375372/is-ther e-a-way-to-get-all-the-querystring-name-value-pairs-into-a-collection – Portekoi

+0

@max也没有真正提高可读性。 – CodeCaster

+0

@CodeCaster它比以前更好,因为它看起来不是问题的一部分,而更像是其他人如何实现它的例子。你现在做的更好。 – Max

回答

1

已经有一个字典 - 它被称为Request.QueryString。

+0

请参阅我的编辑。 – user2384366

1

尝试自定义模型粘合剂

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

更多具体到mvc模型绑定是为了解释克拉查询字符串作为

/somemethod?model[0].Key=1 &模型[0]。价值=一个&模型[1]。重点= 2 &模型[1]。价值=两个

定制绑定将只需按照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"); 
    } 
相关问题