ASP.NET Core : 三. 项目结构(下)

简介: ASP.NET Core : 三. 项目结构(下)

③ _Layout.cshtml

布局模板, 简单的说就是所有采用此模板的页面拥有大体一致的布局,


举个例子, 我们的页面经常是这样的结构:

image.png


Header、Footer和Navigation基本上是不变的, 打开_Layout.cshtml, 我们可以看到一个@RenderBody()标识, 它其实就是来定义Content部分的,


继承此模板的页面只需要提供这部分内容即可.


当然, 常见的还有类似@RenderSection("Scripts", required: false)这样的标识, 引用此模板的页面可以将该页的特定JS的引用放在对应的Section中.


引用此模板, 只需在页首如下配置即可.

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}


每个页都配置比较麻烦? ⑥ _ViewStart.cshtml 会帮忙.

④ _ValidationScriptsPartial.cshtml

<environment include="Development">
    <script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
</environment>


打开此页面, 可以看到一些这样的引用, validation 顾名思义是用来做验证的, 我们经常看到这样的页面


image.png


当输入的格式不正确的时候, 给出提示, 最早我们经常是在输入后或者提交前用js将输入的内容正则验证一下,


这个不用那么麻烦了, 我们通过如下代码引用_ValidationScriptsPartial.cshtml, 也就是采用jquery-validation来做验证

@section Scripts {
    @await Html.PartialAsync("_ValidationScriptsPartial")
}


注意: 默认的_Layout模板是未引用的, 因为不是所有页面都需要有输入操作.


Model中设置验证方式

[Required(ErrorMessage ="用户名不能为空!")]
        [Display(Name = "用户名")]
        public string UserName { get; set; }
        [EmailAddress(ErrorMessage ="Email格式不正确!")]
        [Required]
        [Display(Name = "EMail")]
        public string EMail { get; set; }


在页面添加验证即可:

<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
    <label asp-for="Email"></label>
    <input asp-for="Email" class="form-control" />
    <span asp-validation-for="Email" class="text-danger"></span>
</div>


validation细化起来内容还很多, 此处只是大概介绍一下, 后文会专题研究.


⑤ _ViewImports.cshtml

先不说这个, 再说一个消失了的Web.config. 就是Framework版本的MVC项目中的View目录下的那个.


image.png


在View中引用Model等的时候, 为了避免写using .... , 我们可以在这个config中添加这些引用

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="FrameworkMVCTest" />
        <add namespace="FrameworkMVCTest.Model" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

现在打开_ViewImports.cshtml,

@using HelloCore
@using HelloCore.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers


这里其实就是实现了上面的功能.


有一个比较特别的地方就是比原版MVC多了个@addTagHelper


在上文的validation中我们看到过这样的代码

<label asp-for="Email"></label>
    <input asp-for="Email" class="form-control" />
    <span asp-validation-for="Email" class="text-danger"></span>


原来我们是这样写的

@Html.LabelFor(m => m.EMail)
@Html.EditorFor(m => m.EMail)
@Html.ValidationMessageFor(m=>m.EMail)


初步看来这个 TagHelper 和 HtmlHelper 有点像, 具体先了解这么多, 后文细化.


⑥ _ViewStart.cshtml

这个打开就一句话,

@{
    Layout = "_Layout";
}


这个页面中的内容会在所有View执行前执行, 现在这句话就是给所有的View一个默认的Layout模板.


所以在View中这样写

@{
    Layout = null;
}


和这样写

@{
}


是不一样的, 第一种是告诉这个View不采用任何模板.


第二种写法是什么都不干, 所以它会采用_ViewStart.cshtml中指定的模板.


当然, 这个_ViewStart.cshtml的作用不只是写这么一句话, 我们还可以在这写一些其他需要"通用"执行的内容.


⑦ wwwroot

看这名字好像是IIS的默认网站根目录, 它包含了所有的"前端"的静态文件,  css、image、JS以及一个名为lib的文件夹.


lib中默认内容是bootstrap和jquery.


在Startup中, 会调用一个无参数的UseStaticFiles()方法, 将此目录标记到网站根目录.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //.....        
    app.UseStaticFiles();
    //.....
}


具体静态文件的路径及相关自定义配置, 授权等后文详细研究.


⑧ appsettings.json和appsettings.Development.json


这就是原来的framework版本的MVC的Web.config文件了.


不过这个算是够精简的了, 默认情况没几句话,只有对于log日志的相关配置,


当然正常项目中我们要配置的肯定不止这一点, 举个例子, 数据库连接

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=ContosoUniversity1;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}

⑨ bundleconfig.json

默认文件内容如下:

[
  {
    "outputFileName": "wwwroot/css/site.min.css",
    "inputFiles": [
      "wwwroot/css/site.css"
    ]
  },
  {
    "outputFileName": "wwwroot/js/site.min.js",
    "inputFiles": [
      "wwwroot/js/site.js"
    ],
    // Optionally specify minification options
    "minify": {
      "enabled": true,
      "renameLocals": true
    },
    // Optionally generate .map file
    "sourceMap": false
  }
]


这里主要涉及两个概念:


1.Bunding


    可以理解为绑定或者合并, 也就是把几个文件合并成一个大文件, 减少请求次数.


    上文的代码可以看到, inputFiles 是一个数组, 而outputFileName 是一个单独的文件名,


 以css为例, inputFiles里面已经有一个文件 wwwroot/css/site.css, 假如现在页面还需要一个wwwroot/css/skin.css,


 如果不做合并, 页面打开的时候就需要分别请求这两个文件, 做了合并之后, 即将这个skin.css文件也写入数组中, 只要请求


 /css/site.min.css这一个文件即可.


2.Minification


 翻译为缩减, 即将代码中注释和多余空格等删除, 甚至将变量名改为一个字符来缩减文件的大小.


     例如下面的JS代码


AddAltToImg = function (imageTagAndImageID, imageContext) {
    ///<signature>
    ///<summary> Adds an alt tab to the image
    // </summary>
    //<param name="imgElement" type="String">The image selector.</param>
    //<param name="ContextForImage" type="String">The image context.</param>
    ///</signature>
    var imageElement = $(imageTagAndImageID, imageContext);
    imageElement.attr('alt', imageElement.attr('id').replace(/ID/, ''));
}


     缩减后的代码:

AddAltToImg=function(n,t){var i=$(n,t);i.attr("alt",i.attr("id").replace(/ID/,""))};


一下就减少了好多.


通过以上两种方式组合不但减少了请求次数,还减小了请求的静态文件的总大小, 从而提高加载时间和性能.


在上文查看_layout模板文件的时候我们就见过这样的代码:

<environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>


详细的配置说明暂时不说, 大概的意思就是在Development模式下加载未绑定和缩减的文件, 方便阅读和调试.


和非Development情况下,加载处理过的文件来提高性能.

⑩ Program.cs

public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }
        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }

这里有一个非常熟悉的Main方法, 也就是应用的起点, 启动后通过UseStartup<Startup>()指定下文的Startup启动文件进行启动.


⑪ Startup.cs

这是Mvc Core非常重要的地方, 包括加载配置, 通过依赖注入加载组件, 注册路由等都在此处进行.


默认的代码中:

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())   //指定错误页
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
            app.UseStaticFiles(); //指定静态文件
            //设置路由
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }

如上图所示, 默认情况下设置了两种不同状态下的错误页, 指定静态文件并且设置了路由.

在这里, 我们可以向管道中通过中间件的方式插入我们需要的工作内容.

比如我们还可以用app.UseAuthentication()来做身份验证.

我们使用 Use、Run 和 Map 来配置 HTTP 管道。


Use 方法可使管道短路(即不调用 next 请求委托)。

Run 是一种约定,并且某些中间件组件可公开在管道末尾运行的 Run[Middleware] 方法。

Map* 扩展用作约定来创建管道分支。


此处涉及内容非常多, 比如管道机制、路由注册、身份认证等都需要专题研究.


⑫ .bowerrc和bower.json

bower是一款优秀的前端包及依赖管理工具,.bowerrc指定了文件位置, bower.json则进行了详细的配置,如下面的bootstrap和jquery

{
  "name": "asp.net",
  "private": true,
  "dependencies": {
    "bootstrap": "3.3.7",
    "jquery": "2.2.0",
    "jquery-validation": "1.14.0",
    "jquery-validation-unobtrusive": "3.2.6"
  }
}


详细的使用方法就不在这里介绍了.

小结:

刚新建的项目的结构大体就是这样,  主要功能介绍完了就是一个个详细研究了.


目录
相关文章
|
6天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
24 5
|
24天前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
35 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
14天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
23 3
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
开发框架 前端开发 .NET
ASP.NET MVC项目的创建(4)
ASP.NET MVC项目的创建(4)
127 0
ASP.NET MVC项目的创建(4)
|
开发框架 前端开发 .NET
ASP.NET MVC项目的创建(3)
ASP.NET MVC项目的创建(3)
118 0
ASP.NET MVC项目的创建(3)
|
开发框架 前端开发 .NET
ASP.NET MVC项目的创建(2)
ASP.NET MVC项目的创建(2)
101 0
ASP.NET MVC项目的创建(2)
|
开发框架 前端开发 .NET
ASP.NET MVC项目的创建(1)
ASP.NET MVC项目的创建(1)
154 0
ASP.NET MVC项目的创建(1)
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
46 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
74 0