2015-09-05 64 views
1

我需要实现哪些组件,以及如何将它挂接到框架中,以便让具有名称包含2个或更多单词的查询参数的连字符用连字符分隔?ASP MVC:如何在查询参数名称中使用带连字符的路由?


例如:

我会有这个网址:

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

我想有这样的:

www.mysite.com/resource/i-am-looking-for?parameter-one=foo &参数两=酒吧

我的行动将是这样的:

ActionResult DoSomething(string parameterOne, string parameterTwo) 

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


我需要有:

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

是否有一个图表,我可以在这方面看到框架的可扩展性点?

谢谢!

+0

我很好奇,你为什么要这么做? –

回答

0

如何在客户端的URL编码?

这种方式可以使用一般方法调用控制器。请看看其中的一个答案:Encode URL in JavaScript?

+0

嗯,我的问题不是关于编码,而是关于如何改变路由系统以改变url模式。 – Dan

+0

@ user2704你能否提供完整的请求url以便更好地理解你需要什么(url的一般部分和粗​​体的虚线参数)? –

+0

@ user2704,您需要使用这些示例编辑您的问题,以清楚您想要实现的目标。它不清楚你为什么要这样做,但你可以使用自定义模型绑定器来做到这一点。 –

-1

例如:这是您的操作。

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:......(为你的不同)/新闻/新细节/ 1

新号1将打开。 我希望它有帮助

+0

谢谢你的帮助,但你不明白我想要什么。我可以有一个连字符的路由,但我希望有连字符的查询参数名称。 用你的例子我可以有/ news/new-detail/1?parameterOne = 2(即使“parameterOne”没有被绑定) – Dan

0

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

,如果你放松你需要绑定到强类型的输入瓦尔的动作,你可以用Request.QueryString["some-var"]实现你的目标,但你将不得不处理类型转换和错误与之相关的处理。

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