【问题标题】:ASP MVC: How can I have routes with hyphens in query parameters name?ASP MVC:如何在查询参数名称中包含带有连字符的路由?
【发布时间】:2015-12-01 17:07:24
【问题描述】:

我需要实现哪些组件以及如何将其连接到框架中,以便使查询参数的名称包含 2 个或多个由连字符分隔的单词的 URL?


例如:

我会有这个网址:

www.mysite.com/resource/i-am-looking-for?parameterOne=foo&parameterTwo=bar

我想要这样:

www.mysite.com/resource/i-am-looking-for?parameter-one=foo&parameter-two=bar

我的操作是这样的:

ActionResult DoSomething(string parameterOne, string parameterTwo)

原因:用户友好的网址和一致性


我需要:

  • 与框架 URL 帮助程序(Url.Action、Url.RouteUrl 等)无缝集成的组件
  • 要绑定到动作参数(或模型)的传入数据

有没有图可以看到这方面的框架扩展点?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    public ActionResult SomeAction( string Some-Var ) {} 无效,因为在 C# 中变量名不能包含连字符。允许使用下划线,但这是有效的public ActionResult SomeAction( string Some_Var ) {}

    现在,如果您放松将强类型输入变量绑定到操作的需要,您可以使用 Request.QueryString["some-var"] 实现您的目标,但您必须处理与之相关的类型转换和错误处理。

    【讨论】:

      【解决方案2】:

      您可以添加Custom Value Provider Factory,如下所示,

      public class MyQueryStringValueProvider : NameValuePairsValueProvider
      {
          public QueryStringValueProvider(
             HttpActionContext actionContext, 
             CultureInfo culture)
              : base(
                  () =>{ 
                     var request = actionContext.ControllerContext;
                     foreach(var pair in request
                         .GetQueryNameValuePairs()){
                        yield return new KeyValuePair<String,String)(
                             Transform(pair.Key), pair.Value
                        );
                    }, culture)
          {
          }
      
          private String Transform(String key){
              // just removing all - , as it is case insensitive
              // 
              return key.Replace("-","");
          }
      
      
      }
      

      并且您必须如下所示注册您的提供商,

            ValueProviderFactories.Factories.Add(
                new MyQueryStringValueProvider());
      

      为了安全起见,您可以删除现有的 QueryStringValueProvider 以避免没有破折号的键的名称冲突。

      动作名称中的破折号可以参考https://github.com/AtaS/lowercase-dashed-route

      【讨论】:

        【解决方案3】:

        客户端的url编码怎么样?

        这样您就可以使用通用方式调用控制器。请查看有关该问题的答案之一:Encode URL in JavaScript?

        【讨论】:

        • 嗯,我的问题不是关于编码,而是关于如何更改路由系统以更改 url 模式。
        • @user2704 您能否提供完整的请求网址,以便更好地了解您的需求(网址的一般部分和粗​​体虚线参数)?
        • @user2704,您需要使用这些示例编辑您的问题,以便清楚您想要实现的目标。目前尚不清楚您为什么要这样做,但您可以使用自定义模型绑定器来做到这一点。
        • @StephenMuecke 好的;那是用于传入数据的,但是 url 生成呢(我在列表中的第一点)
        【解决方案4】:

        例如:这是您的操作。

        public ActionResult GetNew(int id) 
        {
              return View(news.Where(i => i.Id == id).SingleOrDefault());
        }
        

        第一步 打开 App_Start>RouteConfig.cs 在你的项目中打开。

        public class RouteConfig
        {
          public static void RegisterRoutes(RouteCollection routes)
           {
              routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
              routes.MapRoute(
              name: "GetNew",
               url: "news/new-detail/{id}",
              defaults: new { controller = "News", action = "GetNew", id = ""}
               );
           }
        }
        

        现在运行你的项目并编写你的浏览器http://localhost:….(对你来说不同)/news/new-detail/1

        新的 ID 号 1 将打开。 希望对你有帮助

        【讨论】:

        • 感谢您的帮助,但您不明白我想要什么。我可以有一个带连字符的路由,但我也希望有带连字符的查询参数名称。通过您的示例,我可以拥有 /news/new-detail/1?parameterOne=2 (即使“parameterOne”未绑定)
        猜你喜欢
        • 2022-09-28
        • 1970-01-01
        • 2014-09-22
        • 2017-09-07
        • 2012-04-01
        • 2018-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多