我有asp.mvc项目。目前路由设置为以下url的形式:
site/school/45
site/school/45/courses
site/school/45/teachers
site/school/45/courses/17
etc.
我想将这个'45'(学校的id)更改为更“用户友好”的名称,例如取名为'45'的学校。 现在行动方法如下:
public ActionResult Index(int schoolId)
{ ...
是否可以在不更改操作方法的情况下更改路由以显示学校名称而不是schoolID?
答案 0 :(得分:4)
“不改变动作方法”似乎是你问题中最重要的部分,对吗?
是的,你可以。您可以覆盖控制器类中的OnActionEcecuting(ActionExecutingContext filterContext)
方法,为您执行name-id映射。您需要执行以下操作:
实现基本控制器类,如下所示:
public class BaseController: Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var shoolName = filterContext.RouteData.Values["schoolName"].ToString();
var schoolId = ...; // Get school id from name somehow here
filterContext.RouteData.Values.Add("schoolId", schoolId);
}
}
(我在此假设您将在Global.asax.cs / RegisterRoutes中将相应的路由参数名称从schoolId
更改为schoolName
。
更新所有控制器,使其不是从Controller
继承而是从BaseController
继承,如下所示:
public class SomethingController: BaseController
{
...
}
之后一切都应该有效。您无需更改控制器操作 - schoolId
参数将在调用它们时就已存在。
答案 1 :(得分:2)
您需要向全局路由添加新路由以允许字符串名称而不仅仅是int id。 最好的选择是创建一个获取学校名称的新方法,然后(从数据库或缓存的对象/字典)将名称转换为id,然后转发到int索引方法。
像这样的东西(未显示缓存)
public ActionResult Index(string schoolName)
{
var schoolId = SomeMethodThatGetsTheIdFromString(schoolName)
RedirectToAction("Index", new { id = schoolId });
}
答案 2 :(得分:0)
你可以使用自定义模型绑定器实现此目的,根据名称计算出学校的ID,并使用它来“绑定”到schoolId
参数。
但是,我建议您按照原样保留路线 - 例如,如果学校名称发生变化,则表示所有书签都不再有效,或者您的网址显示不正确。