MVC3路由仅工作1个方向

时间:2012-03-12 15:31:26

标签: asp.net asp.net-mvc-3 url-routing html.actionlink url.action

我正在开发一个包含多个项目实体的ASP.NET mvc 3站点,然后每个项目都有几个相关的子页面,每个子页面都与项目的一个组件一起使用。

例如,我可以拥有一个包含多张照片,里程碑,用户信息等的项目。我有一个项目索引视图,以及一个链接到多个组件页面的项目主页。大多数组件都有两个视图,索引和编辑/视图。

所以我为编辑和视图设置了一条路线。请注意,我的路线位于名为ProjectManagement

的区域中
   context.MapRoute(
            "ProjectManagement_ProjectPageSingle",
            "ProjectManagement/{controller}/{action}/{projectNumber}/{projectChildId}",
            new { controller = "Project", action = "Home" }
   );

我的控制器操作看起来与此类似:

 public ActionResult Edit(string projectNumber, string projectChildId)

当我直接在浏览器中输入URL时,这种方法很有效。例如:

~/ProjectManagement/Milestone/Edit/39999P110175/1   

然而,当我使用:

生成一个动作链接时
 <a href="@Url.Action("Edit", new { projectNumber = Model.Project.ProjectNumber, projectChildId = entry.Id})">

操作网址最终如下所示:

~/ProjectManagement/Milestone/Edit/39999P110175?projectChildId=1

所以路由sorta有效......但是动作链接生成器没有?不知道从哪里开始。任何建议将不胜感激。

请注意,使用@ Html.ActionLink而不是@ Url.Action时会出现同样的情况。

谢谢!

2 个答案:

答案 0 :(得分:0)

您似乎没有指定区域名称:

@Url.Action(
    "Edit", 
    new { 
        projectNumber = Model.Project.ProjectNumber, 
        projectChildId = entry.Id,
        area = "ProjectManagement" 
    }
)

另外,请确保在您的区域注册中没有任何其他可能与此路线相冲突的路线,如下所示:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "ProjectManagement_default",
        "ProjectManagement/{controller}/{action}/{projectNumber}/{projectChildId}",
        new { controller = "Project", action = "Home" }
    );
}

答案 1 :(得分:0)

感谢Michael的回复。这是其他人的答案。

我有:

 context.MapRoute(
            "ProjectManagement_ProjectPage",
            "ProjectManagement/{controller}/{action}/{projectNumber}",
            new { controller = "Project", action = "Home"}
 );

 ///more routes

  context.MapRoute(
             "ProjectManagement_ProjectPageSingle",
             "ProjectManagement/{controller}/{action}/{projectNumber}/{projectChildId}",
             new { controller = "Project", action = "Home" }
  );

URL也匹配ProjectPage路由,因此首先使用了该URL。不得不翻转订单,所以首先是更具体的路线。

感谢。