MVC 传递 id 以“”“”分隔采取行动

发布于 2024-12-22 18:43:15 字数 315 浏览 1 评论 0原文

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

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

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

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

I want to have possibility to access action by the following URL type:

http://localhost/MyControllerName/MyActionName/Id1+Id2+Id3+Id4 etc.

and handle it in code in the following way:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

箹锭⒈辈孓 2024-12-29 18:43:15

+ 是 url 中的保留符号。它意味着空白。因此,为了实现您正在寻找的目标,您可以编写一个自定义模型绑定器:

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

显然,如果您想使用表单的 url /MyControllerName/MyActionName/Id1+Id2+Id3+Id4 会将最后一部分绑定为名为 ids 的操作参数,您必须修改使用 ids 的默认路由定义代码>{id}。

+ is a reserved symbol in an url. It means white space. So to achieve what you are looking for you could write a custom model binder:

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

and then either register it globally for the string[] type or use the ModelBinder attribute:

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

Obviously if you want to use an url of the form /MyControllerName/MyActionName/Id1+Id2+Id3+Id4 that will bind the last part as an action parameter called ids you will have to modify the default route definition which uses {id}.

把回忆走一遍 2024-12-29 18:43:15

最终选择了以下解决方案:

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

After all chose the following solution:

    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();
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文