2013-04-12 49 views
-1

现在,这个问题。我有一个电子商务网站,我有一个名为Store的控制器,带有一个操作索引。当某人输入www.mysite.com/sony时,我想要使用参数brand=Sony转到控制器存储和操作索引。如果有人输入www.mysite.com/sony-tv,我想转到控制器存储和操作索引,但参数brand=sonydepartment=tvAsp.net MVC路由总是以参数

我通过为存储在数据库中的每种情况创建路由并在应用启动时动态构建路由来获得该路由。在少数情况下,它的工作很好。 首先,我需要索引路线。我需要在索尼之前映射索尼电视,否则/索尼电视同样映射到/索尼。

当我进入网站的家(www.mysite.com)并点击Url.Action(“Index”,“Store”,new {brand = Sony})时,它会将我路由到www.mysite.com/sony 。 NICE!现在,在SONY品牌中,我会点击Url.Action(“索引”,“商店”,新品牌=索尼,部门=电视),我可以看到索尼的所有电视。

一切都运行良好,直到这里。在数据库中,我有1条路径到/ sony,我说我有一个名为品牌的索尼价值参数和一个索尼品牌的限制品牌。我有另外一条路线对索尼电视说同样的道路。模式sony-tv有一个名为sony的品牌参数和一个名为tv的deparment的参数,以及相同的参数约束。

在我的脑海里,它意味着www.mysite.com/Sony的路线是Store/Index/brand = sony,而www.mysite.com/sony-tv是Store/Index/brand = sony &部门=电视。有了约束,我明白,如果部门不是电视或者参数部门不存在,它将发送到www.mysite.com/sony

当我在www.mysite.com/sony-tv时,如果我将鼠标移过其他品牌,链接构建到Url.Action(“Index”,“Store”,new {brand = Apple})是www.mysite.com/Apple-Tv 我有一条路线Apple-TV等于索尼。该网址存在,但我没有通过电视参数。我通过这个链接(品牌链接)只有品牌。我想将用户转移到品牌的根,他已转移到品牌+部门。

我不知道,它看起来像部门变量再次通过,我不知道如何取消。

我完全错了吗?我在做什么是有效的?我能做到吗?我的错误在哪里?

在CSHTML文件:

@Html.ActionLink(febrand.Name.ToUpper(), "Index", new { controller = "Store", brand= febrand.FriendlyName, department = string.Empty }) 

在最终的HTML文件(从谷歌浏览器显示源代码):这似乎是很多工作的东西,你可以做

<a href="/sony?department=tv">SONY</a> 
+0

更新回答 – Tommy

回答

1

最前一页,有两个自定义路线。此外,随着您的路线表变得更大(例如添加更多品牌和/或部门),由于必须扫描更大的路线列表,因此您的网站的每个请求都需要更长的时间才能完成。

那么,让我们尝试修复你的路由表。将这两条路在Global.asax 上述您的默认路由:

routes.MapRoute(
    "Department", 
    "{brand}-{department}", 
    new { controller = "Store", action = "Index" }; 

routes.MapRoute(
    "Brand", 
     "{brand}", 
     new { controller = "Store", action = "Index" }); 

至于你的问题,当你创建动作链接,路由引擎握住部门路线值从你的观点目前在。为了让它在生成链接时忘记该参数,在不需要时为部门变量发送空值。

@Html.ActionLink("Apple", "Index", new{controller="Store", brand="Apple", department = string.empty}); 

编辑

我觉得你可能是一个奇怪的边缘情况与你的路由(有全隔着那么这个问题的例子不胜枚举,如herehere)。除了我提供的解决方案之外,该解决方案是切换到Html.RouteLink而不是Html.ActionLink。

RouteLink签名,我们将使用

Html.RouteLink(string linkText, string routeName, object RouteValues) 

示范品牌链接,你的代码

@Html.RouteLink(febrand.Name.ToUpper(), "Brand", new { controller = "Store", action = "Index", brand= febrand.FriendlyName}) 
+0

感谢您的关注。 department = null指令会返回一个编译器(vs2012)错误:无法将分配给匿名类型属性。 它的权利?我还在做其他事情吗? –

+0

尝试分配部门= string.empty – Tommy

+0

另一个错误,现在在maprout指令: 路由URL不能以'/'或'〜'开头,并且不能包含'?'字符 我无法使用/ {品牌} :( –