我的项目中有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 and Child Company部分?
我希望我的问题清楚。
答案 0 :(得分:2)
首先,您正在为公司使用公司(单数),但之后您正在使用联系人(复数)作为联系人。从结构的角度来看,这没有什么不妥,但如果你的复数与你的复数一致,你的用户会感谢你。我会在两种情况下使用复数,但这只是我的偏好...它看起来更像英语。
您还使用小写字母表示联系人,但大写字母表示公司。看起来不专业。
接下来令人困惑的是你使用了两个{id}参数,一个用于公司,一个用于联系人。我认为这些分别是公司和联系人的ID。但我很困惑,但作为人类,我能够推断出与计算机不同的背景。因此,您最好在路线中指定参数。即:
/Companies/{CompanyId}/Contacts/{ContactId}/[action]
我觉得你不能正确理解路线。如果你这样做了,那么你的问题会更具体。
您的路线参数可能来自多个来源,具体取决于路线的请求方式。
您可以将其硬编码到链接中。或者,更有用的是,您的路线注册将用于捕获映射到您的操作签名的请求。
例如,我有一个电子教学应用程序,包括导师,学生,课程和步骤(即,步骤就像课程的一部分,学生逐步推进课程)
路线注册类似于:
路线或区域注册
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动作的签名:
<强> CoursesController:强>
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,tutorName)
如果您考虑一下,路由的作用是将请求的url转换为动作,因此我的路由的参数是控制器名称,动作名称,否则它们是动作签名中的参数名称
您现在可以看到为什么用相同的方式命名两个不同的路由参数 名字是一个坏主意(主要是因为它不起作用)。
因此,请查看您的行动签名,并设计您的路线和行动链接,以便将所有内容结合在一起。
MVC无法通过魔法发挥作用!! (虽然它使用名称约定的方式可能会让你相信它)