我希望能够通过以下网址类型访问操作:
http://localhost/MyControllerName/MyActionName/Id1+Id2+Id3+Id4等。
并按以下方式在代码中处理它:
public ActionResult MyActionName(string[] ids)
{
return View(ids);
}
答案 0 :(得分:8)
+
是网址中的保留符号。这意味着白色空间。因此,为了实现您的目标,您可以编写自定义模型绑定器:
public class StringModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (value != null && !string.IsNullOrEmpty(value.AttemptedValue))
{
return value.AttemptedValue.Split(' ');
}
return base.BindModel(controllerContext, bindingContext);
}
}
然后全局注册string[]
类型或使用ModelBinder
属性:
public ActionResult MyActionName(
[ModelBinder(typeof(StringModelBinder))] string[] ids
)
{
return View(ids);
}
显然,如果你想使用/MyControllerName/MyActionName/Id1+Id2+Id3+Id4
形式的url将最后一部分绑定为名为ids
的动作参数,你必须修改使用{id}
的默认路由定义}。
答案 1 :(得分:0)
毕竟选择了以下解决方案:
public ActionResult Action(string id = "")
{
var ids = ParseIds(id);
return View(ids);
}
private static int[] ParseIds(string idsString)
{
idsString = idsString ?? string.Empty;
var idsStrings = idsString.Split(new[] { ' ', '+' });
var ids = new List<int>();
foreach (var idString in idsStrings)
{
int id;
if (!int.TryParse(idString, out id))
continue;
if (!ids.Contains(id))
ids.Add(id);
}
return ids.ToArray();
}