Asp.net mvc 是否可以使用其他值更改url路由参数

Asp.net mvc 是否可以使用其他值更改url路由参数,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc Routing,我有一个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) { ... 是否可以在不更改操作方法的情况下更改路由以显示学

我有一个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)
{ ...
是否可以在不更改操作方法的情况下更改路由以显示学校名称而不是学校id?

您可以使用自定义模型绑定器来实现这一点,以根据名称计算学校id,并使用它“绑定”到您的
学校id
参数


但是,我建议您保持现有的路由方式—例如,如果学校名称发生更改,则意味着所有书签将不再有效,或者您的url将显示不正确。

您需要向全局路由添加新路由,以允许使用字符串名称,而不仅仅是int-id。 最好的选择是创建一个新方法,该方法采用学校名称,然后(从数据库或缓存的对象/字典)将名称转换为id,然后转发到int-index方法

类似这样的内容(未显示缓存)

“不改变行动方式”似乎是你问题中最重要的部分,对吗

是的,你可以。您可以在控制器类中重写OnActionEcecuting(ActionExecutingContext filterContext)方法来为您进行名称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);
            }
    }
    
    public class SomethingController: BaseController
    {
        ...
    }
    
    (这里我假设您将在Global.asax.cs/registerOutes中将相应的路由参数名称从
    schoolId
    更改为
    schoolName

  • 更新所有控制器,使其不是从
    Controller
    继承,而是从
    BaseController
    继承,如下所示:

    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);
            }
    }
    
    public class SomethingController: BaseController
    {
        ...
    }
    
  • 在那之后,一切都应该正常。您无需更改控制器操作-
    schoolId
    参数将在调用它们时已就位