2010-12-18 98 views
4

我有一个问题,MVC-3为我生成传出路由。问题ViewBag和路由(MVC 3 - RC2)

这是页面的我在这两种方案地址:http://localhost:1283/Conflict/Create/1200/300

这里有地图路线:

routes.MapRoute(
    null, // Route name 
    "{controller}/{action}/{custId}/{projId}", // URL with parameters 
    null, // Parameter defaults 
    new { custId = @"\d+", projId = @"\d+" } 
); 

routes.MapRoute(
    null, // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 

方案1:

从控制器:

public ActionResult Create(int custId, int projId) 
{ 
    return View(); 
} 

从视图:

@Html.ActionLink("Back to List", "Index", "Conflict", new { custId = ViewBag.custId, projId = ViewBag.projId }, null) 

生成的结果链接。

http://localhost:1283/Conflict?custId=1200&projId=300

如果我改变控制器代码如下:

public ActionResult Create(int custId, int projId) 
{ 
     ViewBag.custId = custId; 
     ViewBag.projId = projId; 

     return View(); 
} 

我并没有在视图中的任何改变,只加这两条线的控制器和下面的链接创建:

http://localhost:1283/Conflict/Index/1200/300

缺少什么我在这里?这是一贯的行为,我能够在我的应用程序的其他领域重现这一点。 “解决方案”是显而易见的,但我的问题是为什么?

+0

我无法在我的机器上重现此行为!奇怪 – swapneel 2011-03-08 20:39:56

+0

索引操作方法还是创建?在你的actionlink中,第二个参数是“Index”? – 2011-03-17 12:54:32

回答

2

发生了什么事是“?custId = 1200 & projId = 300”链接的一部分将从您用于获取您所在页面的链接中过来。所以Html.ActionLink调用是这样做的:

  1. 生成/冲突/索引路径
  2. 认准CUSTID和PROJID在ViewBag,发现查询字符串,而不是
  3. 只是附加您的查询字符串

在第二种情况下,实际上是提供值,所以链接正常生成。希望有所帮助。