gpt4 book ai didi

c# - 如何处理 ASP.NET MVC 3 中每个键的多个值?

转载 作者:可可西里 更新时间:2023-11-01 08:12:24 27 4
gpt4 key购买 nike

我有以下问题:我正在使用的系统中最重要的功能之一是搜索页面。在此页面中,我有一些选项,例如每页记录数、开始日期、结束日期和有问题的选项:类型。一个人必须有选择不止一种类型的可能性(大多数时候,他们都会被选中)。为了完成这项工作,我创建了以下内容:

<div>
<label>Eventos:</label>
<div>
@Html.ListBox("events", Model.Events, new { style = "width: 100%" })
</div>
</div>

它创建了一个列表框,我可以在其中选择多个选项,提交表单后,我的查询字符串将如下所示:

/5?period=9&events=1&events=3&recordsPerPage=10

可以看到创建了两个事件(这是我之前所说的类型)。此页面的操作方法采用 List<long>作为其参数之一,代表两个 events值。当我想将它与 MVC Contrib 一起使用时,问题就开始了。他们的寻呼机工作得很好,但按照我的要求,我创建了另一个寻呼机,它显示用户所在页面之前和之后的五个页面的链接。为此,在我的部分代码中,我必须执行以下操作(这与有效的 MVC Contrib pager 非常相似):

public RouteValueDictionary GetRoute(int page)
{
var routeValues = new RouteValueDictionary();
foreach (var key in Context.Request.QueryString.AllKeys.Where(key => key != null))
{
routeValues[key] = Context.Request.QueryString[key];
}

routeValues["page"] = page;
return routeValues;
}

然后:

@Html.ActionLink(page.ToString(), action, controller, GetRoute(page), null)

问题是它是一个字典,这使得我第二次设置 routeValues["events"] 的值。抹去之前的。

你们知道如何使用它吗?

最佳答案

很好的问题。不幸的是,使用 Html.ActionLink 帮助程序生成具有多个同名查询字符串参数的 url 并不容易。所以我可以看到两种可能的解决方案:

  1. 为能够解析逗号分隔值的 long[] 编写自定义模型绑定(bind)器。这样您就可以保留将生成以下 url 的 GetRoute 方法:period=9&events=1%2C3&recordsPerPage=10&page=5

    public class CommaSeparatedLongArrayModelBinder : DefaultModelBinder
    {
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
    var values = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
    if (values != null && !string.IsNullOrEmpty(values.AttemptedValue))
    {
    // TODO: A minimum of error handling would be nice here
    return values.AttemptedValue.Split(',').Select(x => long.Parse(x)).ToArray();
    }
    return base.BindModel(controllerContext, bindingContext);
    }
    }

    您将在 Application_Start 中注册:

    ModelBinders.Binders.Add(typeof(long[]), new CommaSeparatedLongArrayModelBinder());

    然后下面的 Controller 操作将能够理解以前的 URL:

    public ActionResult Foo(long[] events, int page, int period, int recordsPerPage)
    {
    ...
    }
  2. 手动生成这个 anchor :

    <a href="@string.Format("{0}?{1}&page=5", Url.Action("action", "controller"), Request.QueryString)">abc</a>

关于c# - 如何处理 ASP.NET MVC 3 中每个键的多个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6048218/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com