2010-05-07 22 views
0

我有几个硬编码(非参数)部分定义的路由:生成与非参数的URL段路线链接上ASP.NET MVC 2

routes.MapRoute(null, "suggestion/list/by/{tag}", 
     new { controller = "Suggestion", action = "List", tag = UrlParameter.Optional }); 

想我在的索引视图SuggestionController,它有一个Model的Suggestion对象,我如何创建一个匹配该路线的链接?

我知道我可以通过使用纯醇完成I” HTML这样的:

<a href="/suggestion/list/by/<%=Model.Tag %>"><%=Model.Tag %></a> 

但是,这使得它不可能通过其它路由参数(如一个RouteValueDictionary,例如),不是吗?

我真的想知道是否可以使用提供的助手之一,但没有命名路线。我宁愿将路由名称保留为空,以避免对我的视图进行硬编码,但我无法弄清楚如何在Html.ActionLink或RouteLink方法中使用这些非参数段。

任何想法?

在此先感谢。

回答

1

帮助程序方法将考虑您设置的路线,以便您可以使用它们,并且它们会根据需要输出网址。例如:

<%= Html.Action(Model.Tag, "List", "Suggestion", new { tag = Model.Tag }, null) %> 

甚至更​​好,如果你使用的是MVC期货组件,您将能够与魔术字符串做掉,做:

<%= Html.Action<SuggestionController>(c => c.List(Model.Tag), Model.Tag) %> // Add checks for null if Tag can be null 

编辑:已指出在评论中,上面有一个错字,对Action的调用应该是ActionLink

+0

谢谢你的回答s1mm0t。 2件事:我想你的意思是第一个代码片段中的Html.ActionLink(Html.Action没有这样的重载),所以我尝试了像你所建议的ActionLink,但它呈现以下路由: /suggestion/list/by?tag = TestTag 哪个当然不起作用。我需要它实际渲染: /建议/列表/通过/ TestTag 我是否在路由定义中错过了某些东西? – 2010-05-08 10:08:51

+0

是的你是对的,在上面的解决方案中有一个错误,我现在已经添加了一个编辑。我已经测试了两次,并且它对上述两个解决方案都很好(显然使用ActionLink; O))。你的路线肯定被使用?应该先添加更具体的路线,否则将使用更通用的路线。尝试将上面的路线添加为第一条路线,就像测试一样,然后尝试使用ActionLink。 – s1mm0t 2010-05-08 12:45:03

+0

好吧,这是令人尴尬的......我在我的路由定义中只有* only参数*。我的路由被定义为建议/列表/ by/{it},这当然会将tap作为查询字符串参数呈现。 :þ谢谢s1mm0t,你正确的回答回家;) – 2010-05-08 14:17:07

1

我认为在这种情况下最好使用RouteLink方法。使用RouteLink,您可以明确定义您要使用的路线的名称。因此,如果您没有其他理由不在路线中输入名称,请将其命名为“建议”(或其他任何您想要的)。所以RouteLink将是:

<%: Html.RouteLink(Model.Tag, "suggestion", new RouteValueDictionary { tag = Model.Tag }) 

我有一个类似的问题与复杂的路线,这是我唯一的解决方案。 希望它有帮助...

+0

坦克。我意识到这是行得通的,但我很好奇,如果没有将我的观点与我的路线定义紧密结合,是否可能。它一定是可能的? – 2010-05-08 11:18:25