当使用Url.Action时,controller 和 action 的当前路由值是指定的 -- controller 和 action 的值同时是环境值和值的一部分。Url.Action 方法总是使用 controller 和 action 的当前值,并且生成路由到当前操作的URL路径。
路由尝试使用环境值中的值来填充信息,同时我们也可以指定路由参数:
public class HomeController : Controller { public IActionResult Index() { //生成/Blog/Edit/1 var url = Url.Action("Edit", "Blog",new { id=1}); //生成/Blog/Edit/1?color=red var url1 = Url.Action("Edit", "Blog", new { id = 1 ,color="red"}); return View(); } }
如果像创建一个绝对URL,可以使用一个接受protocol的重载: Url.Action("Edit", "Blog",new { id=1},protocol:Request.Scheme);
12.通过路由名生成URL
IUrlHelper也提供了 Url.RouteUrl 的系列方法,最常见的是指定一个路由名来使用具体的路由生成URL,通常没有指定控制器名或操作名:
public class HomeController : Controller { public IActionResult Index() { //生成customer/to/url var url = Url.RouteUrl("AboutRoute"); return View(); } [HttpGet("customer/to/url",Name = "AboutRoute")] public IActionResult About() { ViewData["Message"] = "Your application description page."; return View(); } }
在HTML 中生成的URLHtmlHelper,提供了 HtmlHelper 方法 Html.BeginForm 和 Html.ActionLink 来分别生成<form>和<a>元素。这些方法使用Url.Action方法来生成一个URL,并且它们接受类似的参数。Url.RouteLink ,它们有类似的功能。TagHelper通过form和<a> TagHelper生成URL。这些都使用了IUrlHelper 作为它们的实现。在内部视图中,IUrlHelper 通过Url 属性生成任何不包含上述的特定URL。
13.在操作结果中生成URL
在控制器中常见的一个用法是生成一个URL作为操作结果的一部分。Controller和ControllerBase 基类为引用其他操作的操作结果提供了简单方法。一个典型的方法:
public class HomeController : Controller { public IActionResult Index() { //生成customer/to/url var url = Url.RouteUrl("AboutRoute"); return Redirect(url); //或者 //return RedirectToAction("Contact"); } [HttpGet("customer/to/url",Name = "AboutRoute")] public IActionResult About() { ViewData["Message"] = "Your application description page."; return View(); } public IActionResult Contact() { ViewData["Message"] = "Your contact page."; return View(); } }
RedirectToAction方法有多个重载可以使用。
14.专用常规路由的特殊情况
有一种特殊的路由被称为专用常规路由,下面被命名为blog的路由就是:
app.UseMvc(routes => { routes.MapRoute("blog", "blog/{*article}", defaults: new { Controller = "Blog", Action = "Index" }); routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
Url.Action("Index", "Home") 会使用默认路由生成URL。
专用常规路由是依靠默认路由的一个特殊行为,没有相应的路由参数,以防止路由生成URL“太贪婪”。当路由执行URL生成时,提供的值必须与默认值匹配:否则使用blog的URL生成失败,因为值 {controller=Home,action=Index}不匹配{controller=Blog,action=Index} 。然后路由回退尝试default,并成功。
15.区域
Areas 是一种MVC功能,用来将相关功能组织为一个组,作为单独的路由命名空间(用于控制器操作)和文件夹结构(用于视图)。使用区域允许应用程序拥有多个相同名称的控制器——只要它们具有不同的区域。使用区域通过向控制器和操作添加另一个路由参数,区域可创建用于路由目的的层次结构。
使用默认常规路由配置MVC,命名一个OMS区域的路由:
app.UseMvc(routes => { routes.MapAreaRoute("oms", "OMS", "OManage/{controller}/{action}/{id?}", defaults: new { Controller = "Order", Action = "Index" }); routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
namespace Blog.Areas.OMS.Controllers { [Area("OMS")] public class OrderController : Controller { // GET: Order public ActionResult Index() { return View(); } }
当URL为 /OManage/Order/Edit 时,会匹配路由值 {area = OMS,controller = Order , action = Edit} 。area路由值是通过area默认值产生的。使用MapRoute方法也可以实现:
routes.MapRoute("oms", "OManage/{controller}/{action}/{id?}", defaults:new {area="OMS" },constraints:new { area = "OMS" });