ASP.NET MVC 工作中的重要技巧
在本文中,我们将探讨在使用 MVC5 工作时的一些重要技巧。这些技巧在实际操作 ASP.NET MVC 时非常有用。
引言
以下是在 ASP.NET MVC 项目中工作时的一些有用技巧:
- MVC 中的
ViewEngine
用于生成 HTML(称为 Razor)。 - HTML 5 中的 HTML 标签带有
lang="en"
来指定默认语言。 - 带有
charset="utf-8"
的 Meta 标签,它指定了来自其他站点的跨站脚本不会损害我们的网站。 - 带有
name="viewport"
的 Meta 标签用于移动设备。没有这个 meta 标签,移动设备会假设您的页面需要 900px 才能正确显示。有了这个 meta 标签,我们就告诉设备不要做任何假设。页面会自动适应设备的宽度。 - 脚本标签
src="/Scripts/modernizr-2.5.3.js"
。这支持 HTML5 标记可以在所有浏览器(甚至 IE-6)中工作。 - Controller - 入站 HTTP 请求会转到控制器。
- Model - Controller 负责调用 Model。Model 包含用户需要看到的所有信息。
- View - Controller 选择 View 来显示 Model。它只是一个模板。
- MVC - 这是一个设计模式,当您想分离组件的职责时,可以遵循它。
- MVC 是可测试的。特别是,Controller 应该是可测试的。
- 命名约定在 MVC 中起着重要作用。
- View 具有 cshtml 扩展名。
ViewBag
是 MVC C# 中的动态类型对象。- Model 可以驻留在任何文件夹中,甚至在不同的项目中。
- 路由引擎是 ASP.NET 的核心部分。它并不局限于 MVC。它可以用于 WebForms、WCF、WebServices 和 MVC。
- 路由引擎
MapRoute
API 为 URL、路由模式以及路由和默认参数提供了友好的名称。它的工作是检查 URL 并确定将其发送到何处进行处理。 - Controller 调用 Action。查找特定的
ActionName
方法。 - Razor View 是 cshtml 扩展名。可以将它们视为用于在标记中显示数据的标记。
- 重计算逻辑不在 Views 中。
- Views 自动处理 HTML 编码。
- 在
@{}
内部,我们可以在 View 中输出 C# 代码。 - 在 View 的 C# 代码内部,如果我们想要一些静态文本或 HTML 文本,我们必须在要显示的文本前面使用
@:
。 RenderBody()
方法将渲染 .cshtml 页面以生成 UI 输出。- _ViewStart.cshtml 文件描述了应用程序的公共 Layout。
RenderSection()
方法用于渲染在View
的任何位置定义的节。它也处理 Ajax。- Views 中的 HTML 帮助器有助于创建操作链接、编辑和验证等。
- 匿名对象在 MVC 中被大量使用。
TryUpdateModel()
方法会经历 Model Binding 的过程。Model Binder 会查找 Update 并更新值。- 如何在 Views 中构建自定义逻辑?(需要深入研究)
- Partial Views 用于在多个视图之间重用。
Html.Action()
帮助器可以在_layout
中调用。它将调用一个子请求,进一步调用另一个Controller
,该 Controller 构建自己的Model
,独立于主 Controller 的操作,并渲染自己的视图,这是一个部分视图。它不是一个单独的 HTTP 请求。- Entity Framework 如何填充 Schema,可以通过使用 EF-Migration 来完成。EF 中的 Migrations 是一个工具,它允许使用 C# 代码配置 Schema,并可以使 Schema 与 C# 代码同步以进行任何更改。例如:在 PM 中,输入
Enable-Migration -ContentTypeName "DBclassname"
- EF
DbContext
中的AddOrUpdate()
方法会自动检查记录是否存在,然后更新或插入它。 - LinQ 查询是强类型的。也就是说,编译器和 VS 知道我们正在查询的数据类型。LinQ 使用 Comprehension Query Syntax 和 Extension Method Syntax(Lambda 表达式,也适用于自定义分页)。
- Projection 可用于在 C# 代码的 Linq 查询中获取要列出的列。
- 示例:
Select aliasname;
- 定义扩展方法的类必须是非泛型且静态的。
- 每个扩展方法都必须是
static
方法。 - 很多时候,我们的页面需要比我们的
Entity
更多信息。在这种情况下,我们使用 View-Model。Projection 在这里会很有帮助。 - 使用 Comprehension expression 或 Extended expression 无论如何都不会影响查询性能。它只是编写相同查询的另一种方式。
- 在开发过程中,我们应该非常清楚何时使用 "
get
" 方法,何时使用 "post
" 方法。通常get
操作是读取操作,post
操作是保存、更新、删除或在服务器上处理某些内容。 - 在设计搜索页面时,我们可以使用
get
方法,因为它只是读取值并显示给用户。get
方法将输入包装在查询字符串中以处理请求。 - ASP.NET MVC 按名称匹配请求中的内容。
- Virtual 关键字将在运行时创建包装器。
- 在 CRUD 操作之前,请检查
ModelState IsValid
。 - 如果您不想更新任何特定字段,请使用
[Bind()]
属性,并带有value Exclude="fieldname, 可以用逗号分隔"
。 - 另一种实现相同目的的方法是使用 View-Model,它只包含其内部定义的属性。
DataAnotations
用于Model
内部的验证。- 自定义验证属性可用于在不同页面上进行自定义验证。
- 还实现
IValidatableObject interface
。 - 在 Scripts 文件夹中,有一个 _refrences.js 文件,它引用了常用的 js 文件。
- knockout.js 用于 Model-View View-Model 设计模式。它提供了声明式数据绑定等脚本。
- modernizer 文件用于检测并在各种浏览器上运行 HTML 5 功能。
- jquery.in.js 是一个最小化的文件,没有注释或空格,以便浏览器可以更快地加载文件。
- jquery.unobtrusive-ajax.js 充当 jQuery 和 ASP.NET MVC 之间的桥梁。它通过向 jquery 验证提供元数据来使用验证。
- Bundling 可以在运行时将多个文件捆绑到一个文件中。在 Global.asax 的
Application_Start
中,有Bundle.config RegisterBundle
。 @Scripts.Render("~/bundles/modenizr")
- 当我们在发布模式下运行应用程序时,浏览器只需要下载一个文件;而在调试模式下,所有捆绑的文件都可以单独下载。
Ajax.BeginForm
发起异步请求到服务器;而BeginHtmlForm
发起同步请求到服务器,这意味着服务器会进行完全回发。- 在控制器内部,我们可以检查
if (Request.IsAjaxRequest()) {//do this}
。 - 不显眼 JavaScript (unobtrusive JavaScript) 的 MVC 功能有三个。
- 它们是
Ajax.BeginForm
, Ajax.ActionLink
-> 发起异步请求并更新屏幕,而不是将浏览器导航到新页面。- 客户端验证 -> 不显眼 JavaScript 意味着我们没有在 click 事件上写 JavaScript,因为那是显眼 js(obtrusive js),它也意味着即使 JavaScript 在我们的浏览器中被禁用,它也能工作,因为它的异步回发。
- 使用 data- 属性,我们可以自定义处理 Ajax 的方式,使用客户端 JavaScript,以及自定义消息等。
- Jquery 自动完成 UI 文档说,json 应该有一个 label 属性或 value,或者两者都有。
- 对于自定义分页,我们使用
PagedList
和PagedList.Mvc
。 - 身份验证:基于表单(需要 Cookie、SSL 来保证安全),OpenID/OAuth(第三方,如 Microsoft 或 Twitter),Windows 身份验证(Windows 操作系统与 Active Directory 和单点登录的身份验证)。
- WebMatrix/WebSecurity 被用来借鉴标准 ASP.NET 的一些功能,如表单身份验证。
SimpleMemberShipProvider
- 跨站请求伪造 ->
[ValidateAntiForgeryToken]
:将其放在所有提交表单上,也放在 cshtml 文件中@Html.AntiForgeryToken()
。 - ASP.NET MVC 通过
DotnetOpenAuth
支持 OpenID/OAuth。 OutputCache
可用于在服务器、客户端或服务器-客户端(通过在中间使用一些代理服务器)上缓存数据。VaryByHeader="X-Requested-With"
用于 Ajax 请求。同时设置Location=OutputCacheLocation.Server
。- 缓存的最佳测试地点是在生产环境中进行测试时。
- 始终在 config 文件中使用 Cache Profile,而不是硬编码值。
- 在使用资源文件时,请确保 resx 文件的访问修饰符设置为
Public
,因为 Razor 文件是单独编译为public
的,并且只有在文件是公共访问时才能访问 resx 文件。 VaryByHeader="X-Requested-With;Accept-Language"
用于处理多语言支持的资源文件。- 使用 elmah 进行错误处理。
- 开始开发单元测试用例,与业务开发/QA 团队一起开发可能的测试用例并运行所有测试用例。
- 部署和测试是开发 ASP.NET MVC 应用程序中最重要的部分。
- 对于整个网站都使用的 CSS,我将其定义在
_Layout
的@RenderSection("Styles", false)
部分,如果我需要一些视图特定的样式,我会在每个视图中定义Styles
部分:@section Styles {}
。 - ASP.NET Web API 是一个在 .NET Framework 之上构建 Web API 的框架。
- Controller 是一个处理 HTTP 请求的对象。
- Web API 中的 Controller 从
ApiController
类派生,而不是从Controllerclass
派生。 - 您注意到的第一个主要区别是 Web API controller 中的 Action 不返回视图,它们返回数据。
getJSON
函数发送 AJAX 请求。响应将是一个 JSON 对象数组。getJSON
的第二个参数是一个回调函数,在请求成功完成后被调用。- 理解路由
- 对于每个 HTTP 消息,ASP.NET Web API 框架通过查阅路由表来决定哪个 Controller 接收请求。
- 当您创建一个新的 Web API 项目时,该项目包含一个默认路由,如下所示:
/api/{controller}/{id}
。 {controller}
和{id}
部分是占位符。- 当框架看到匹配此模式的 URI 时,它会查找 Controller 方法来调用,如下所示:
{controller}
匹配 Controller 名称。 - HTTP 请求方法匹配方法名称。(此规则仅适用于
GET
、POST
、PUT
和DELETE
请求。){id}
,如果存在,则匹配名为id
的方法参数。 - 查询参数在可能的情况下匹配参数名称。
- 在 ASP.NET Web API 中,Controller 是一个处理 HTTP 请求的类。Controller 的
public
方法称为 Action 方法或简称 Action。当 Web API 框架收到请求时,它会将请求路由到一个 Action。 - 四个主要的 HTTP 方法(
GET
、PUT
、POST
和DELETE
)可以映射到 CRUD 操作,如下所示:GET
检索指定 URI 处资源的表示。GET
不应对服务器产生副作用。PUT
更新指定 URI 处的资源。如果服务器允许客户端指定新的 URI,PUT
也可用于在指定 URI 处创建新资源。在本教程中,API 不支持通过 PUT 进行创建。POST
创建一个新资源。服务器分配新对象的 URI,并将其作为响应消息的一部分返回此 URI。DELETE
删除指定 URI 处的资源。
注意:
PUT
方法会替换整个产品实体。也就是说,客户端需要发送更新产品的完整表示。如果您想支持部分更新,建议使用PATCH
方法。 - 在 Web API 中,具有复杂类型的参数将从请求正文中反序列化。
看点
在使用 ASP.NET MVC 应用程序时,我们还会遇到许多其他重要要点。这些技巧在面试中也可能很有用。因此,在互联网上随时可以参考这些技巧是一个好习惯,以便在需要时可以随时查阅。