既然我为一个Controller的特定Action写了路由,那我还需要为Controller内部的所有Action都写路由吗?
Since I wrote a route for a specific Action of a Controller, do I need to write a route for all Actions inside the Controller?
我正在为我的 MVC 应用程序编写一些路由。我的申请有以下路线:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Pages", action = "Index", id = UrlParameter.Optional }
);
当我想访问默认值时使用上面的路由:
www.servicili.com/budget/edit/1
www.servicili.com/professional/view/234
但是,我出于特定目的创建了以下路由:
routes.MapRoute(
name: "Perfil",
url: "{UsuApelido}",
defaults: new { controller = "Perfil", action = "Index"}
);
上面的路由,用于访问 "plumber" 的 URL 配置文件,例如:
www.servicili.com/MarkZuckberg
配置文件详细信息在控制器 Perfil 和 Action Index 上,但是,由于我写了这条路线,所有其他操作都不是没有工作。
例如:如果我尝试访问另一个控制器内的 Index 操作,它将重定向到 的 Index Perfil.
--
问题是:既然我为一个Controller的特定Action写了路由,那我还需要为Controller内部的所有Action都写路由吗?
要解决您的问题,请尝试这样,
首先定义约束,
public class PlumberUrlConstraint: IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
var db = new YourDbContext();
if (values[parameterName] != null)
{
var UsuApelido = values[parameterName].ToString();
return db.Plumbers.Any(p => p.Name == UsuApelido);
}
return false;
}
}
定义两条路由,将"Default"路由放在第2个位置
routes.MapRoute(
name: "Perfil",
url: "{*UsuApelido}",
defaults: new { controller = "Perfil", action = "Index"},
constraints: new { UsuApelido = new PlumberUrlConstraint() }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Pages", action = "Index", id = UrlParameter.Optional }
);
现在,如果您在 'Perfil' 控制器中有一个 'Index' 操作,您可以获得这样的管道工名称,
public ActionResult Index(string UsuApelido)
{
//load the content from db with UsuApelido
//display the content with view
}
希望对您有所帮助。
我正在为我的 MVC 应用程序编写一些路由。我的申请有以下路线:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Pages", action = "Index", id = UrlParameter.Optional }
);
当我想访问默认值时使用上面的路由:
www.servicili.com/budget/edit/1
www.servicili.com/professional/view/234
但是,我出于特定目的创建了以下路由:
routes.MapRoute(
name: "Perfil",
url: "{UsuApelido}",
defaults: new { controller = "Perfil", action = "Index"}
);
上面的路由,用于访问 "plumber" 的 URL 配置文件,例如: www.servicili.com/MarkZuckberg
配置文件详细信息在控制器 Perfil 和 Action Index 上,但是,由于我写了这条路线,所有其他操作都不是没有工作。
例如:如果我尝试访问另一个控制器内的 Index 操作,它将重定向到 的 Index Perfil.
-- 问题是:既然我为一个Controller的特定Action写了路由,那我还需要为Controller内部的所有Action都写路由吗?
要解决您的问题,请尝试这样,
首先定义约束,
public class PlumberUrlConstraint: IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
var db = new YourDbContext();
if (values[parameterName] != null)
{
var UsuApelido = values[parameterName].ToString();
return db.Plumbers.Any(p => p.Name == UsuApelido);
}
return false;
}
}
定义两条路由,将"Default"路由放在第2个位置
routes.MapRoute(
name: "Perfil",
url: "{*UsuApelido}",
defaults: new { controller = "Perfil", action = "Index"},
constraints: new { UsuApelido = new PlumberUrlConstraint() }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Pages", action = "Index", id = UrlParameter.Optional }
);
现在,如果您在 'Perfil' 控制器中有一个 'Index' 操作,您可以获得这样的管道工名称,
public ActionResult Index(string UsuApelido)
{
//load the content from db with UsuApelido
//display the content with view
}
希望对您有所帮助。