ASP MVC:如何在查询参数名称中使用带连字符的路由?

时间:2015-09-05 19:05:31

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

我需要实现哪些组件以及如何将其挂钩到框架中,以便将包含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等)
  • 要绑定到操作参数(或模型)的传入数据

是否有图表可以在这方面看到框架扩展点?

谢谢!

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以添加自定义价值提供商工厂,如下所示,

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

答案 2 :(得分:-1)

如何在客户端进行网址编码?

这样您就可以使用通用方式呼叫控制器。请查看其中一个答案:Encode URL in JavaScript?

答案 3 :(得分:-1)

例如:这是你的行动。

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

第一步 在项目中打开App_Start&gt; 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

新身份证号码1将开启。 我希望它有所帮助