ASP.NET MVC高级编程摘要易忘知识点

1、理解MVC模式在Web场景中的工作原理的简便方法就是记住:MVC提供的的是方法调用结果,而不是动态生成的(又名脚本)页面。
2、事件驱动编程的思想—根据用户触发的事件来执行程序操作。
3、侵入式JavaScript:在Web早期,没出现jquery以前,同一个文件中混杂JavaScript代码和Html标记是很流行的。将JavaScript代码作为HTML某个特性的值也是很常见的。如以下代码:

<div onclick="javascript:alert('click');">Testing, testing</div>

非浸入式JavaScript很好的实现了JS代码和标记的分离,可以将脚本代码打包到JS文件中符合MVC提倡的关注点分离。
注:非浸入式JavaScript除了实现了内容显示和交互行为的分离,还有其他优势,例如将所有脚本代码保存在单独的可下载的文件中让浏览器能够在本地缓存脚本文件,从而提高网站性能。
4、Jquery的引入方式
①通过每个页面单独引入文件

<script src="~Scripts/jquery-1.10.2.js"></script>

②在布局页引入JS方法和①一样
③虽然脚本引用是有用的,但是这种方法依赖于版本,如果想要更新到最新版本的Jquery,就必须在代码中查找脚本引用,并使用新版本号加以替换。更好的在视图中包含Jquery引用的方法是使用内置的、版本无关的Jquery脚本捆绑。
@Scripts.Render(~/bundles/jquery)
上面的调用将渲染/App_Start/BundleConfig.cs中预定义的“jquery”脚本捆绑,这种捆绑利用了ASP.NET中的捆绑和微小特性,该特性利用版本号中包含的通配符匹配,自动优先使用jQuery的轻量版本。

public static void RegisterBundles(BundleCollection bundles)
 {
    bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                "~/Scripts/jquery-{version}.js"));

        //......
 }

5、关于min.js
在新建的Web项目Script文件夹下每个文件都包含另外一个对应脚本文件的微小化版本。JavaScript微小化是通过删除注释、进而缩短变量名来缩小JavaScript文件的过程,以及其他缩小文件大小的过程。
Jquery也包含一个.min.map.js版本。这是一个源代码映射文件。源代码映射是一种新兴的标准,允许浏览器将微小化的、编译后的代码映射为原来编写的代码。
6、Respond.js
Respond.js 是一个很小的JavaScript库,包含这个文件是因为BootStrap要用到它,属于所谓的pollyfill
,即让旧浏览器支持新浏览器标准的JS库。
7、捆绑和微小
捆绑(bundling)和微小(minification)功能由名称空间System.Web.Optimization中的类提供。故名思议这些类是用来优化Web页面性能的,他们通过缩减文件大小,捆绑文件(把多个文件合并成一个下载文件)来实现优化。
8、ASP.NET MVC框架中的路由主要由两种用途:
①匹配传入的请求(请求不匹配服务器文件系统中的文件),并把这些请求映射到控制器操作
②构造传出的URL,用来响应控制器操作。
路由关注的是如何将URL映射到资源。
9、传统路由和特性路由
MVC一直支持使用集中的、强制的、基于代码的风格来定义路由,我们将其称为传统路由这是一个很好的选项,现在仍得到完整支持。不过MVC5添加了另外一个在控制器类或者操作方法上使用声明式特性的选项,称为特性路由。
10、特性和传统路由的比较
如果传统路由和特性路由存在重叠,那么会使用第一个遇到的路由。在实践中建议把MapMvcAttributeRoutes调用放在首位。特性路由通常更加具体,传统路由更加宽泛,所以让特性路由首先出现可以让他们有比传统路由更高的优先级。
11、MVC区域
区域允许我们将模型、视图和控制器分成单独的功能节点。
12类和结构的区别
1、结构是值类型,类是引用类型。
注意:结构的new运算符与其他类型的工作方式不同。new运算符并不分配堆中内存,而是调用相应的构造函数,根据传送给它的参数,初始化所有的字段。
在调用struct实例方法之前,必须给struct的所有字段赋上初值,即要求完全初始化,部分初始化是不允许的。要么通过"struct实例.字段名"给所有字段显式赋值,要么通过struct构造函数,给所有字段赋上默认值。
2、结不能从一个结构中继承,
13、MVC布局

<!DOCTYPE html>
<html>
    <head>
        <title>@ViewBag.Title</title>
    </head>
    <body>
        <h1>@ViewBag.Title</h1>
        <div id="main-content">@RenderBody()</div>
        <footer>@RenderSection("Footer")</footer>
    </body>
</html>

对应视图的代码

@{
    Layout = "~Views/Shared/SiteLayout.cshtml";
    ViewBag.Title = "The Index";
}

<p>this is the main content!</p>

@section Footer{
    this is the <strong>footer</strong>.
}

@section语法为布局中定义的一个节指定了内容。
默认情况下,视图必须为布局中定义的每一个节提供内容。如果向当前的布局中添加一个新节时,会使得引用该布局的每一个视图都不能正常运行。

但是,RenderSection方法有一个重载版本,允许指定不需要的节。可以给required参数传递一个false值来标记Footer节是可选的。

@RenderSection("Footer", required: false)
14、@Html.DisplayNameFor和 @Html.DisplayFor区别 (1)@Html.DisplayNameFor(model => model.Title)是显示列名, (2)@Html.DisplayFor(modelItem => item.Title)是显示列的内容 其实,编译器本意并不是输出属性名称,而是通过定制属性制定的字符串。看模型中Title属性的定义,上面被贴上了若干个定制属性。这些定制属性告诉编译器,在调用DisplayNameFor()方法时应该输出什么、格式是什么。
 [Display(Name = "标题")]
 public string Title { get; set; }

@Html.DisplayNameFor(model => model.Movie[0].Title)的显示结果为 标题

DisplayNameFor HTML 帮助程序检查 Lambda 表达式中引用的 Title 属性来确定显示名称。 检查 Lambda 表达式(而非求值)。 这意味着当 model、model.Movie 或 model.Movie[0] 为 null 或为空时,不会存在任何访问冲突。 对 Lambda 表达式求值时(例如,使用 @Html.DisplayFor(modelItem => item.Title)),将求得该模型的属性值。
15、@Html.LabelFor的作用
@Html.LabelFor(model => model.Title, “标题”, new { @class = “control-label col-md-2” }) @Html.TextBox(“Title”, Model.Title, new { @class = “form-control col-md-10” })
大家注意到 label的for属性的作用了吗? Label的作用是为其他输入元素提供附加信息,for的作用是 如果用户点击Label,浏览器会把对应的焦点给到 相关的输入控件。
16、特性路由后续
1)路由特性必须在基于约定的路由之前进行配置。
2)当组合使用路由特性和基于约定路由时,此时未有使用路由特性时,则基于约定路由有效。
3)当只有路由特性时,对于定义基于约定而没有使用路由特性的Action方法时,此时将不会被访问到。
4)在Route特性中使用~来重写Action的前缀规则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值