MVC传递id由“+”分隔为动作

时间:2011-12-24 16:31:47

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我希望能够通过以下网址类型访问操作:

http://localhost/MyControllerName/MyActionName/Id1+Id2+Id3+Id4等。

并按以下方式在代码中处理它:

public ActionResult MyActionName(string[] ids)
{
  return View(ids);
}

2 个答案:

答案 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();
    }