如果在asp.net mvc中的URL在控制器的索引/ show方法签名中具有不符合的args,是否可以在签名中使用类似params string [] args的东西来收集它们起来。或者当arg是一个分离值列表(即不是名称/值对)时,有什么好办法呢?
我们有用户,最终创建具有可变数量参数的网址&需要解析它们。
这是我们目前的代码,但我们不禁想到没有自己拆分字符串的更好方法:
var url = Request.RawUrl.Split('?');
if (url.Length > 1)
{
var queryString = url[1];
var queryStringArgs = queryString.Split('&');
var queryStringMembers = from arg in queryStringArgs
let c = arg.Split('=').Length == 1
where c
select arg;
ViewBag.QueryStringMembers = queryStringMembers.ToJson();
}
*附加:这些args没有name = value,它只是一个值列表。 Request.QueryString似乎没有帮助我们,因为它不同地处理这些查询字符串args,因为它们不是name = value,它们只是值。所以它将它们放在Request.QueryString [null]键中,以逗号分隔
答案 0 :(得分:1)
首先,您拥有的是格式错误的网址。所以你完全可以解析它。您可能还希望它随时都会失败。作为查询字符串一部分的所有内容,即在第一个?
之后,必须进行网址编码,您不应该有多个?
。
据说你可以写一个自定义模型绑定器:
public class CustomModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var tokens = controllerContext.HttpContext.Request.RawUrl.Split('?');
if (tokens.Length > 1)
{
return tokens.Skip(1).ToArray();
}
return null;
}
}
然后:
public ActionResult Index([ModelBinder(typeof(CustomModelBinder))]string[] args)
{
return View();
}
答案 1 :(得分:0)
Request.QueryString.AllKeys
将包含QueryString中发送的参数名称的字符串数组。这就是你要找的东西吗?