主观概括(略带盐分):
首先,您将 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)
这里有几点需要注意:
我可以通过给用户一个点击链接来调用这个特定的路由。
我使用 Html.ActionLink 帮助器构建此链接
-
我使用了 David Ebbo 的 t4mvc nuget 包,以便我可以指定我正在调用的操作及其参数。我的意思是使用以下命令指定 Html.ActionLink 助手的 ActionResult 参数:
MVC.Courses.Course.Actions.Display(Model.CourseId, step.StepOrder, Model.Pupil.UserName,utorName)
如果你考虑一下,路由所做的就是将请求的 url 转换为动作,所以我的路由的参数要么是控制器名称,要么是动作名称,否则它们是动作签名中的参数名称.
您现在可以看到为什么将两个不同的路由参数命名为相同的
name 是个坏主意(主要是因为它不起作用)。
因此,请查看您的操作签名,并设计您的路线和操作链接,以便将所有内容结合在一起。
MVC 不能靠魔法工作!! (虽然它使用命名约定的方式可能会让你相信)