5

路由我不能让@Url.Action解析到我根据我已经申请了属性路线上预期的网址:MVC属性与Url.Action不解决途径

我的动作(SearchController但[RoutePrefix(“加“)])

 [Route("{searchTerm}/page/{page?}", Name = "NamedSearch")] 
    [Route("~/add")] 
    public ActionResult Index(string searchTerm = "", int page = 1) 
    { 
     ... 
    } 

电话Url.Action

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 }) 

这导致

/add?searchTerm=replaceMe&page=1

一个网址我希望

/add/replaceMe/page/1

如果键入的URL手动然后将其解析为正确的操作正确的参数。为什么@Url.Action解决了正确的url?

回答

11

既然你有一个漂亮的路线定义的名称,你可以使用RouteUrl方法。

@Url.RouteUrl("NamedSearch", new { searchTerm = "replaceMe", page = 1}) 

由于您需要添加网址,您应该更新您的路由定义以将其包含在url模式中。

[Route("~/add")] 
[Route("~/add/{searchTerm?}/page/{page?}", Name = "NamedSearch")] 
public ActionResult Index(string searchTerm = "", int page = 1) 
{ 
// to do : return something 
} 
+1

谢谢,为两条路线添加一个名称并使用RouteUrl是使这两条路线都能正常工作的唯一可靠方法。 – Simon

+0

对于那些来到这里,想要一个ApiController中的行动的路线:@ Url.HttpRouteUrl在这种情况下得到的窍门;-) –

+0

这帮助我通过正确的路线Troy Goode的PagedList。几乎一天的时间,我的脑袋都在绞尽脑汁! – Shiva

3

路由对顺序敏感。但是,属性不是。实际上,当像这样使用2 Route属性时,可能会发现它适用于某些编译,而不适用于其他编译器,因为在分析自定义属性时,Reflection并不能保证顺序。

为确保您的路由以正确的顺序输入到路由表中,您需要将Order属性添加到每个属性。

[Route("{searchTerm}/page/{page?}", Name = "NamedSearch", Order = 1)] 
[Route("~/add", Order = 2)] 
public ActionResult Index(string searchTerm = "", int page = 1) 
{ 
    return View(); 
} 

修复排序问题后,URL可以解决您期望的问题。

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 }) 

// Returns "/add/replaceMe/page/1" 
+0

谢谢,我发现这固定'NamedSearch'路线,但打破了基本路线(订单= 2),如果我使用@ Html.ActionLink(“添加问题”,“索引”,新{控制器=“搜索”})。我能得到这个工作的唯一可靠方法是为两者添加名字。 – Simon

0

要返回完整的URL使用本

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1}, protocol: Request.Url.Scheme) 

// Returns "http://yourdomain.com/add/replaceMe/page/1" 

希望这可以帮助别人。