【问题标题】:MVC3 Routing - Routes that builds on each otherMVC3 路由 - 相互构建的路由
【发布时间】:2011-10-04 12:11:25
【问题描述】:

我的项目中有一个 AREA 设置。我需要使该地区的路线渐进,这意味着路线将相互建立。

我将其视为链接列表。列表中的每个节点都有一个对父节点的引用。在它构建的列表中从左到右移动,从右到左移除它。

在该地区,我有公司,有联系人,还有子公司。

例如,我的公司将拥有以下内容:

 /Companies/list
  /Company/{Id}
  /Company/{id}/add
  /Company/{id}/edit
  /Company/{id}/delete

对于联系人部分,我需要创建以下路线:

 /Company/{id}/contacts/list
 /Company/{id}/contact/{id}/add
 /Company/{id}/contact/{id}/edit
 /Company/{id}/contact/{id}/delete

如何确保 /Company/{id} 始终位于路径的 Contact 和 Child Company 部分?

我希望我已经把我的问题说清楚了。

【问题讨论】:

    标签: asp.net-mvc-3 c#-4.0 asp.net-mvc-routing


    【解决方案1】:

    主观概括(略带盐分):

    首先,您将 Company(单数)用于公司,然后您将联系人(复数)用于联系人。从结构的角度来看,这没有错,但是如果您与多元化保持一致,您的用户会感谢您。在这两种情况下我都会使用复数,但这只是我的偏好……它看起来更像英语。

    联系人也使用小写字母,公司则使用大写字母。看起来不专业。

    接下来令人困惑的是您使用了两个 {id} 参数,一个用于公司,一个用于联系人。我认为这些分别是公司和联系人的 ID。但是我很困惑,但是作为人类,我能够推断出与计算机不同的上下文。因此,您最好在路由中指定参数。即:

    /Companies/{CompanyId}/Contacts/{ContactId}/[action]
    

    用一个例子回答你的问题:

    我觉得你没有正确理解路线。如果你这样做了,你的问题会更具体。

    您的路线参数可能来自多个来源,具体取决于路线的请求方式。

    您可以将其硬编码到链接中。或者,更有用的是,您的路由注册将被设计为捕获映射到您的操作签名的请求。

    例如,我有一个包含导师、学生、课程和步骤的 eLearning 应用程序(即,步骤就像课程的部分,学生一步一步地完成课程)

    路由注册看起来像这样:

    路线或区域登记:

    context.MapRoute(
        "StepDisplay",
        "Course/{CourseId}/Step/{StepOrder}/Pupil/{PupilName}/{TutorName}",
        new { controller = "Course", action = "Display", TutorName = UrlParameter.Optional },
    new[] { "ES.eLearningFE.Areas.Courses.Controllers" }
    );
    

    此路由将捕获来自以下 ActionLink 的请求:

    视图中的 ActionLink:

    @Html.ActionLink(@StepTitle, MVC.Courses.Course.Actions.Display(Model.CourseId, step.StepOrder, Model.Pupil.UserName, tutorName))
    

    现在,我只需向您展示 Display 操作的签名:

    课程控制器:

    public virtual ActionResult Display(int CourseId, int StepOrder, string PupilName, string TutorName)
    

    这里有几点需要注意:

    1. 我可以通过给用户一个点击链接来调用这个特定的路由。

    2. 我使用 Html.ActionLink 帮助器构建此链接

    3. 我使用了 David Ebbo 的 t4mvc nuget 包,以便我可以指定我正在调用的操作及其参数。我的意思是使用以下命令指定 Html.ActionLink 助手的 ActionResult 参数:

      MVC.Courses.Course.Actions.Display(Model.CourseId, step.StepOrder, Model.Pupil.UserName,utorName)

    如果你考虑一下,路由所做的就是将请求的 url 转换为动作,所以我的路由的参数要么是控制器名称,要么是动作名称,否则它们是动作签名中的参数名称.

    您现在可以看到为什么将两个不同的路由参数命名为相同的 name 是个坏主意(主要是因为它不起作用)。

    因此,请查看您的操作签名,并设计您的路线和操作链接,以便将所有内容结合在一起。

    MVC 不能靠魔法工作!! (虽然它使用命名约定的方式可能会让你相信)

    【讨论】:

    • 第一部分还有必要吗? IMO,您应该删除它,因为它是意见/主观的,与这个问题无关。
    • 您的第一个 cmets 在技术上是正确的,这只是我写的问题。我们有资源文件来生成文本,因为您的网站需要是法语/英语,但谢谢。我还需要小心我在 SO 问题中放置的代码。
    • 谢谢你的例子。在我的上下文中,1 家公司有“n”个联系人。所以我需要随时参考公司。我知道路线应该是什么,只是不知道如何生成它。那么对于控制器动作方法来说,参数的顺序是从路由开始的顺序吗?
    • 不,顺序不重要。但名字是!
    • @Kyle Trauberman:在很多方面我都同意,在一个方面我不同意:提出问题的人使用了两个不同的参数并给了它们相同的名称。我想强调在没有标准化标准的情况下注意名称和命名尽可能多的错误......尤其是在 MVC 中。我已经突出显示了第一部分与答案相关的行。
    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2012-05-31
    • 2012-12-03
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多