Asp.Net Core MVC 案例系列一

為全局路由字段分配默認(rèn)值

??MVC應(yīng)用程序的URL路由有兩種定義方式:
??(1)在Startup.Configure方法中通過(guò)UseMvc方法設(shè)置的路由規(guī)則會(huì)應(yīng)用到整個(gè)應(yīng)用程序中;
??(2)在每個(gè)控制器類以及其成員方法上通過(guò)Route特性設(shè)置的路由為局部規(guī)則,僅對(duì)當(dāng)前控制器有效。

??URL路由以字符串的形式表示,其中有三個(gè)占位符,他們屬于路由字典中的Key,需要寫在大括號(hào)中。三個(gè)占位符如下:
??(1){area}:表示MVC程序中的“域”,通常用于劃分程序功能,小型項(xiàng)目可以不使用。
??(2){controller}:表示控制器的名稱。控制器后綴帶有Controller可以省略。
??(3){action}:控制器類中的要執(zhí)行的方法名稱。
??此外,還可以自定義參數(shù)名,例如{controller}/{action}/{id?},其中id是傳遞給action方法的參數(shù)名稱,?號(hào)代表該字段是可選的。

??在實(shí)際開發(fā)中,一般不會(huì)讓用戶記這么長(zhǎng)的URL,對(duì)于程序主頁(yè),只要在瀏覽器地址欄中輸入根URL就能訪問(wèn)默認(rèn)頁(yè)面,因此MVC框架默認(rèn)值為{controller=Home}/{action=Index},當(dāng)用戶輸入 http://someweb.com 時(shí),實(shí)際上就是 http://someweb.com/Home/Index 。

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseMvc(r =>
            {
                r.MapRoute("main", "{controller=Demo}/{action=Default}");
            });
        }
    }

局部的URL路由

??有時(shí)對(duì)于部分控制器,需要局部的URL路由。主要是通過(guò)在控制器類或者控制器類方法成員上附加Route特性來(lái)實(shí)現(xiàn)。它僅在目標(biāo)對(duì)象上有效,優(yōu)越性高于全局路由規(guī)則。

??一般為這種形式:[controller]/[action],[controller]/[action]/{id?}。

??訪問(wèn)如下控制器時(shí),會(huì)用控制器名替換URL路由規(guī)則中的[controller]與[action],即 http://localhost/main/about ,http://localhost/main/home 。

    [Route("[controller]/[action]")]
    public class MainController : Controller
    {
        public ActionResult About()
        {
            return Content("關(guān)于本站");
        }

        public ActionResult Home()
        {
            return Content("官方主頁(yè)");

        }
    }

??訪問(wèn)如下GetList方法的URL是固定的,即 http://localhost/products/list.

    [Route("/products")]
    public class ProductController : Controller
    {
        [Route("list")]
        public ActionResult GetList()
        {
            return Content("產(chǎn)品列表");
        }
    }

自定義視圖文件的查找位置

??在MVC的控制器中調(diào)用不帶參數(shù)的View方法時(shí),將返回與Action名稱相同的視圖。

??框架查找視圖文件的默認(rèn)路徑有三個(gè):
??/Views/{1}/{0}.cshtml;
??/View/Shared/{0}.cshtml;
??/Pages/Shared/{0}.cshtml。
??{1}表示Controller的名稱,{0}表示Action的名稱。假設(shè)訪問(wèn)Goods控制器中的Reset方法,路徑為 /Views/Goods/Reset.cshtml 。Shared目錄下的視圖一般用于布局頁(yè)或共用視圖。

??對(duì)于帶有Area的MVC項(xiàng)目,其查找路徑為:
??/Areas/{2}/Views/{1}/{0}.cshtml;
??/Areas/{2}/Views/Shared/{0}.cshtml;
??/Views/Shared/{0}.cshtml
??/Pages/Shared/{0}.cshtml 。
??此處{2}是Area的占位符。

??RazorViewEngineOptions類公開的AreaViewLocationFormats屬性和ViewLocationFormats屬性,都是用于配置視圖的查找路徑的,均為字符串,可添加多個(gè)。

  • 下面將視圖文件查找目錄從Views改為DemoViews。其中RazorViewEngine.ViewExtension字段能自動(dòng)返回視圖文件的擴(kuò)展名。在項(xiàng)目中創(chuàng)建DemoViews目錄,在DemoViews下創(chuàng)建Sample,Sample下是Test1.cshtml和Test2.cshtml。
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().AddRazorOptions(o =>
        {
            // 清除默認(rèn)路徑
            o.ViewLocationFormats.Clear();
            // 添加自定義的路徑
            o.ViewLocationFormats.Add("/DemoViews/{1}/{0}" + RazorViewEngine.ViewExtension);
            o.ViewLocationFormats.Add("/DemoViews/Shared/{0}" + RazorViewEngine.ViewExtension);
        });
    }
    [Route("[controller]/[action]")]
    public class SampleController : Controller
    {
        public IActionResult Test1() => View();
        public IActionResult Test2() => View();
    }

??運(yùn)行程序,分別用 http://localhost:1909/sample/test1http://localhost:1909/sample/test1 訪問(wèn)。

根據(jù)URL查詢參數(shù)返回不同的視圖

??控制器的View方法有以下幾種方法返回視圖;
??(1)無(wú)參數(shù)調(diào)用。這種視圖文件名必須與當(dāng)前操作方法名相同,即Action名與視圖名一致。
??(2)指定視圖名稱。如果視圖文件位于以當(dāng)前控制器命名的目錄下,那么指定視圖名時(shí)不需要指定文件擴(kuò)展名。
??(3)包含路徑與文件擴(kuò)展名。當(dāng)視圖文件不在當(dāng)前控制器目錄下,或不在設(shè)定查找路徑內(nèi),則需要指定完整路徑。

  • 本例中,更目錄View下有Demo目錄和Default.cshtml文件,Demo目錄下有Pagedview.cshtml和Preview.cshtml。
    public class DemoController : Controller
    {
        public ActionResult GetInfo([FromQuery]string mode)
        {
            if(mode == "preview")
            {
                return View("Preview");
            }
            else if(mode == "pagedview")
            {
                return View("Pagedview");
            }
            return View("~/Views/Default.cshtml");
        }
    }

??mode參數(shù)的值將從URL查詢參數(shù)(在URL中以問(wèn)號(hào)開頭的部分)中提取,所以在聲明參數(shù)時(shí)要加上FromQuery特性,否則無(wú)法提取。
??Pagedview.cshtml和Preview.cshtml都位于與控制器同名目錄下,因此調(diào)用View方法只指定視圖名,但Default視圖需明確路徑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容