微冷的雨ASP.NET MVC之葵花寶典javascript
By:微冷的雨css
第一章 ASP.NET MVC的請求和處理機制.html
在MVC中:前端
01.全部的請求都要歸結到控制器(Controller)上.java
02.約定優於配置jquery
*:全部的控制器放到Controllers文件夾中程序員
*:全部的視圖放到Views文件夾對應的Controller類名的文件夾中web
03.如何經過Session保存用戶登陸信息,以及經過Cookie記錄用戶名ajax
Session和Cookie都屬於系統對象數據庫
設置Cookie(jsp仍是cshtml cookie都不是內置對象)
HttpCookie hcCookie = new HttpCookie(Cookie的名稱, 變量值);
hcCookie.Expires = 過時時間;
Response.Cookies.Add(hcCookie);
//
讀取Cookie
string 變量名 = Request.Cookies[Cookie的名稱].Value;
如何從一個Action跳轉到另一個Action RedirectToAction(「action名稱」,「Controller」)
04.GPR原則:用戶先發一個get請求讓客戶看到登陸界面,而後用戶錄入數據,經過表單的post提交方式提交.登陸成功後要進行跳轉
05.內嵌語法
<%%>
<%=%>
<%:%>
<srcipt runat="server">
在aspx頁面中定義方法
</script>
06.母版頁
ContentPlaceHolder
第二章 基於三層架構搭建MVC系統
01.可選參數
Public void Test(string name,int age=20)
Var:隱式.類型推斷 第一個=不能給null值,必須給一個肯定的值,這樣才能推斷出=左側變量的類型
Dynamic:動態類型 能夠憑空的點出一個自身不存在方法,編譯時不進行類型檢查,在運行時會報錯.
匿名.類中的屬性是隻讀的.
Int? num=5;
Int result=Num??0;
依賴關係
DAL→Model
BLL→Model 和DAL
UI→BLL 和Model
06.會搭建分區項目,會在Areas文件夾下,建立出本身的一套MVC
第三章
01.路由
解析:路由的定義規則,URL規則
Routes.MapRoute(
Name:」Default」,
Url:blogs/{Controller}/{action}/{id},
Defaults:new{ Controller=」Home」,action=」Index」,id= UrlParameter.Optional },
Constraints:new{ id=@」\d{4}」},
Namespaces:new String[]{「BookShop.Controllers」}
)
*****引入了RouteDebug工具,經過在App_Start文件中的RouteConfig類中,添加一行代碼
, //RouteDebug.RouteDebugger.RewriteRoutesForTesting(routes);
02.如何在Controller和View中共享數據
方案二:5種
ViewData
ViewBag
TempData
上面三種的場景簡單數據類型
ViewData.Model 4
View(Model) 5
強類型的複雜類型須要傳遞model使用方式4和5
3.經過看MVC源碼剖析了一下爲何ViewData這個容器能夠實現從Controller到View的數據共享.
解析:Controller →有一個Action→ 返回值類型ViewResult→繼承自ViewResultBase
→ 裏面有ViewData,和一個ExecuteResult()→ExecuteResult()參數是一個控制器對象,更精彩的是在ExecuteResult()方法中new出一個視圖上下文,而且在構造中攜帶了控制器對象,和ViewData數據. →調用View.Render(viewContext)方法渲染視圖, →因爲View是一個接口類型,WebFormVIew視圖引擎是View的一個實現類,WebFormView重寫的Render方法又調用了RenderVIewPage方法,
第四章
00.自動綁定
路由數據,URL數據,表單數據
01.表單數據<URL數據以及路由數據均可以實現自動裝配.若是是表單數據的簡單類型要想實現自動裝配,那麼只須要保證表單元素的name名字必須和參數的名字相同.
02.經過EF來完成應用程序和數據庫之間的數據傳遞.
BookShopEnties:DBContext(EF5.0)
EF4.0繼承自ObjectContext
03.Business Model ViewModel
業務Model:10個字段
視圖Model:3個字段
04.因爲咱們的驗證標籤直接打在生成的實體類的屬性上可能形成驗證特性標籤的丟失(從新生成實體類)
考慮一下如何解決???
解析:助手類
步驟:
[MetaDataType(typeof(UserViewModel))]
Public partial class User
{
}
解析:在Edmx模型中,有一個名稱爲BookShopPlusEntities的類,這個類中會自動根據數據庫中的表名生成一個DBSet<User> Users{get;set;}集合,而後在Controller中就能夠經過db.Users.Add(entity)
.master再也不有,推出了_Layout.cshtml
Bundle技術:牛X在能夠將1000個css樣式表文件合成一次
結論:若是您選取了Razor視圖引擎,那麼不管是否啓用Layout視圖,都要從_ViewStart.cshtml執行.
其實上前端校驗仍是交給了jquery-validate完成的.若是在頁面中沒有引入對應的js庫,那麼不會自動造成前端校驗.
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
Required();必填項
Compare()比較:確認密碼
StringLength();限定字符格式
Range(這裏課本上是錯誤的,不能經過它來驗證日期範圍)
RegularExpression(@」^$」)
ModelState.IsValid:true,代表後臺全部的實體校驗均經過
如何將錯誤信息扔到ValidationSummary中
ModelState.AddModelError(「和Index.chhtml中的表單元素name保持」,」用戶名存在」)
補充遠端校驗:[Remote] System.web.MVC;
補充:經過隱式的ajax請求來實時校驗用戶名是否存在
核心就是每次產生校驗的時候,調用Controller中的一個方法,只不過該方法返回的是
Json數據.
擴展方法三要素:
靜態類 靜態方法 this關鍵字
分頁
Controller中內容:
public ActionResult PageData(int? pageSize, int? pageIndex)
{
pageSize = pageSize ?? 2;
pageIndex = pageIndex ?? 1;
ViewData["CurrentPage"] = pageIndex.Value;
ViewData["PageSize"] = pageSize.Value;
ViewData["TotalCount"] = db.Subjects.Count();
ViewData["PageNum"] = Math.Max((db.Subjects.Count() + pageSize.Value - 1) / pageSize.Value, 1);
var temp = db.Subjects
.OrderBy(c => c.SubjectId)
.Skip<Subject>(pageSize.Value * (pageIndex.Value - 1))
.Take<Subject>(pageSize.Value);
return View("Index",temp);
}
View中生成頁碼條
<div class="paginator">
@Html.ShowPageNavigate((int)ViewData["CurrentPage"],(int)ViewData["PageSize"],(int)ViewData["TotalCount"])
</div>
Day06次課程
01.日曆控件引入
步驟:
01.直接在項目中添加下發的calendar文件夾,而後依次引入
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<link href="~/calendar/Css/calendar.css" rel="stylesheet" />
<script src="~/calendar/dt.js"></script>
<script type="text/javascript">
$(function () {
$("#tName").click(function () {
ShowCalendar(this);
});
})
</script>
02.能夠手動修正dt.js文件,可讓日曆控件同時顯示日期和時間,要看業務場景,
若是隻須要顯示日期,那麼能夠將dt.js中第982行代碼作一個修正,以下
function ShowCalendar(txt) {
displayCalendar(txt, 'yyyy-mm-dd hh:ii', txt,true);
}
同時顯示日期和時間,若是僅僅顯示日期,配置以下:
function ShowCalendar(txt) {
displayCalendar(txt2014-09-09 08:00, 'yyyy-mm-dd', txt,false);
}
02.文件上傳
文件上傳
步驟:01.構造上傳文件的表單
@using(Html.BeginForm("Upload", "FileTest", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input type="file" name="file" />
<input type="submit" name="upload" value="提交" />
}
02.在控制器中進行文件上傳代碼的處理
public ActionResult Upload()
{
return View();
}
[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
if (file!=null)//證實用戶選擇了一個文件
{
//在服務器上找一個文件夾來保存用戶上傳的文件
string path= Server.MapPath("~/files/" + file.FileName);
//就是將客戶端用戶上傳的文件保存到該目錄中.
file.SaveAs(path);
return RedirectToAction("Index");
}
return View();
}
5.經過jquery-ui進行文件上傳
步驟1:01.構造上傳文件的表單
@using(Html.BeginForm("Upload", "FileTest", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input type="file" name="file" />
<input type="submit" name="upload" value="提交" />
}
*步驟一補充:在視圖文件中,引入3個文件,順序不能變
01.jquery文件
02.jquery-ui的樣式文件
03.jquery-ui.js插件
<!--引入Jquery文件-->
<script src="~/Scripts/jquery-1.7.1.js"></script>
<!--引入Jquery-ui-css文件-->
<link href="~/Content/themes/base/jquery.ui.all.css" rel="stylesheet" />
<!--引入Jquery-ui文件-->
<script src="~/Scripts/jquery-ui-1.8.20.js"></script>
04.要將Views文件夾下的_Layout.cshtml文件中的 @* @Scripts.Render("~/bundles/jquery")*@
註釋,不然在Chrome中監視的時候,會發現之後一個錯誤,就是找不到jquery-ui插件的
dialog方法。
步驟2: *02. 在視圖中用一個div將表單包裹起來,而且在div外定義一個a標籤。達到的效果
就是默認狀況下div隱藏的,只有a標籤顯示。起到做用的就是autoOpen屬性。設置爲false,就是
默認隱藏div。
<script type="text/javascript">
$(function () {
$("#dialog").dialog({
autoOpen: false,
show: "blind",
hide:"explode"
})
//寫在此處的代碼已經完成了當前頁面中全部標籤都加載(不包含圖片和css),
//可是和Window.onload方法不一樣,保證全部的標籤和圖片都加載完成後再執行
$("#myupload").click(function () {
$("#dialog").dialog("open");
//原來a標籤起到一個連接到另一個目標頁面的做用,經過return false能夠取消標籤的默認行爲
return false;
})
})
</script>
<div id="dialog" title="文件上傳">
@using (Html.BeginForm("Upload", "File", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input type="file" name="file" id="file1" />
<input type="submit" name="upload" value="提交" />
}
</div>
<a href="#" id="myupload">文件上傳</a>
03. 富文本編輯器
補充下拉框雙向綁定
04.綜合案例
第八章 EF
1.EF體系結構
01.ORM的優點
快速開發
方便移植數據庫
02.流行的ORM框架
Hibernate
MyBatis
TopLink
03..NET 世界的ORM框架
NHibernate
MyBatis.NET
LINQ to SQL
ADO.NET Entity Framework
04.在EF中,對數據對象的操做,實際是在操做EDM。在EDM抽象化的結構之下,
則是概念層(CSDL)、存儲層(SSDL)和對應層(MSL)
CSDL定義了EDM的靈魂部分---概念模型。概念模型對應的是實體類,用實體類
表示數據庫中的對象。
SSDL負責與數據庫管理系統中的數據表作實體對應,描述了表、列、關係、主鍵
及索引等數據庫中存在的概念。
05.關於Object Services:
from c in db.Student
where c.id>0
select c;
c=>c.id
參見msdn:http://msdn.microsoft.com/en-us/library/bb386871.aspx
Object Services is a component of the Entity Framework that enables you to query,
insert, update, and delete data, expressed as strongly typed CLR objects
that are instances of entity types. Object Services supports both
Language-Integrated Query (LINQ) and Entity SQL queries against types
that are defined in the conceptual model. Object Services materializes(成爲現實)
returned data as objects, and propagates(傳遞) object changes back to
the data source. It also
1.T4模板下載地址
http://www.devart.com/t4-editor/download.html
DbSet 表示上下文中給定類型的全部實體的集合或可從數據庫中查詢的給定類型的全部實體的集合。
可使用 DbContext.Set 方法從 DbContext 中建立 DbSet 對象。
2。延遲加載的本質
是IQueryable接口成就了延遲加載
解析:經過擴展IQueryable接口類型,在Queryable類中定義了一個名稱爲Where的擴展方法。
最本質的是經過DbQuery子類來進行延遲加載的。
3.延遲加載的目的不是爲了延遲使用數據,而是爲了延遲生成SQL語句,知足業務需求。
4.查詢出來的對象都是以包裝類的形式存在的。
5.Conceptual schema definition language (CSDL)
概念架構定義語言 (CSDL) 支持一組抽象基元數據類型(稱爲 EDMSimpleTypes),
這些類型在概念模型中定義屬性。
Store schema definition language (SSDL) is an XML-based language
that describes the storage model of an Entity Framework application.
http://msdn.microsoft.com/zh-cn/library/cc982042.aspx
Mapping specification language (MSL) is an XML-based language
that describes the mapping between the conceptual model and
storage model of an Entity Framework application.
In an Entity Framework application, mapping metadata is loaded from
an .msl file (written in MSL) at build time.
The Entity Framework uses mapping metadata at runtime
to translate queries against the conceptual model to store-specific commands.
The Entity Framework Designer (EF Designer) stores mapping information
in an .edmx file at design time. At build time, the Entity Designer
uses information in an .edmx file to create the .msl file
that is needed by the Entity Framework at runtime
Names of all conceptual or storage model types that are referenced in MSL
must be qualified by their respective namespace names.
For information about the conceptual model namespace name,
see CSDL Specification. For information about the storage model namespace name,
see SSDL Specification. provides facilities(工具) for tracking(路線) changes,
binding objects to controls, and handling concurrency(併發性).
Object Services is implemented by classes in the System.Data.Objects
and System.Data.Objects.DataClasses namespaces.
Object Context
The ObjectContext class is the primary class for interacting with data in the form of objects that are instances of entity types that are defined in a conceptual model. An instance of the ObjectContext class encapsulates(囊括) the following:
A connection to the database, in the form of an EntityConnection object.
Metadata that describes the model, in the form of a MetadataWorkspace object.
An ObjectStateManager object that tracks objects during create, update, and delete operations.
06.白話理解Object Services ,Entity Client ,ADO.NET Provider 和EDM MetaData(CSDL,MSL和SSDL)
Object Services:就至關於封裝增刪改查的高級類。例如調用AddObject就能夠實現新增操做。
Entity Client:至關於ADO.NET中的SqlClient Connection,Command
ADO.NET Provider:至關於數據庫的驅動程序
EDM MetaData(CSDL,MSL和SSDL):XML文檔,映射程序中對象和表中對象關係
07.IQueryable接口繼承自IEnumerable接口
總結:
下次課程:
01.模型綁定特性
02.定製視圖模板
03.Razor視圖引擎 @
***重點一:webform :aspx
<% using (Html.BeginForm()) { %>
<% } %>
Razor :cshtml
@using (Html.BeginForm("提交到的action","提交的Controller",FormMethod.Post)) {
}
@{
//僅僅進行內存級別的操做,並不將結果打印到頁面上
}
***重點二:母版頁的概念存在於webform視圖引擎下,在Razor視圖引擎下,
沒有母版頁,只有佈局頁面(視圖),_Layout.cshtml
ViewStart.cshtml :視圖在渲染的時候第一個執行的頁面。
LogIn.cshtml:
_Layout.cshtml:對頁面的<html><title>以及樣式和js都作了設置。
而且預留了子頁面須要填補的內容RenderBody()
***重點三:http協議
關於HTTP協議:以前的http協議版本是1.0,短鏈接。也便是當客戶端
向服務器發出一個請求後,服務器返回給客戶端響應後,鏈接當即斷開,
後來出現了長鏈接,也就是如今通用的1.1,將間隔時間很短的屢次請求
合併,這樣提高網站的性能。
***重點四:狀態碼
狀態碼:
200:OK ,服務器已經正確作出響應。
302:暫時重定向。
303:永久重定向
304: Not Modified(未修改)客戶的緩存資源是最新的, 要客戶端使用緩存
404:404 Not Found 未找到資源
500:服務器內部錯誤!
***重點五:壓縮文件技術:Bundle技術:
問題:請求一個頁面Index,頁面上引用了10個外部CSS,須要發幾回請求?
解析:發送11次請求,請求頁面的文本一次請求。請求10個CSS須要10次請求。因此
總共是11次請求。
手動配置本身的Bundle。
//本身的css壓縮名稱
bundles.Add(new StyleBundle("~/Content/mine").Include("~/Content/mycolor.css","~/Content/myfont.css"));
***重點六:ModelState:
功能一:是攔截程序跨過驗證的一種有效手段
--ASP.NET Page.IsValid
--ASP.NET MVC ModelState.IsValid:本質上能夠對應用的先後臺同時進行驗證。
哪怕前端禁用了js,也沒法跨事後臺咱們給對應標籤設置的特性。
功能二:當action中某個分支語句有錯誤,須要從Controller傳遞到View視圖的時候,
咱們可使用ModelState.AddModelError("key","錯誤信息字符串")
ModelState.AddModelError("key「,Exception對象)
在前臺VIew中有一個ValidationSummary(true);
第九章 EF高級應用
01.如何從委託進化到Lambda
委託
匿名函數
Lambda
1.LINQ
LINQ(Language Integrated Query)語言集成查詢
LINQ to Entities;主流,後臺能夠是任意數據庫。
EF這個ORM礦建性能比較優良。!@
LINQ to Objects:(string,數組和集合)
Linq to xml
Linq to SQL:後臺數據庫只能是SQL server數據庫,微軟中止更新
2.
01.查詢「北京大學出版社」
最先出版的3本書籍
var query= (from c in Books
where c.Publisher.Name.Equals("北京大學出版社")
orderby c.PublishDate descending
select c.Title).Take(3)
編譯後,和以下SQL語句等價
select top 3 * from books,publishers
where books.publiserid=publishers.id
and publisers.name='北京大學出版社'
order by publisherdate
02.
查詢分類爲「C#」 、2003
年前出版的書籍,
包括書名、出版社名稱
from c in Books
where c.Category.Name.Equals("C#") &&
c.PublishDate<Convert.ToDateTime("2003-01-01")
select new {c.Title,c.Publisher.Name}
03.查詢出版書籍超過100本的出版社名稱
var list = from c in db.Publishers
where c.Books.Count > 100
select c.Name;
重點:全部LINQ查詢語句均可轉換成查詢方法
有的查詢方法不能用LINQ查詢表達式表示
3.FirstOrDefault()和SingleOrDefault()區別
解析:這裏以First、FirstOrDefault進行說明,其餘相似。
1、First:取序列中知足條件的第一個元素,若是沒有元素知足條件,則拋出異常
2、FirstOrDefault:取序列中知足條件的第一個元素,若是沒有元素知足條件,
則返回默認值(對於能夠爲null的對象,默認值爲null,對於不能爲null的對象,
如int,默認值爲0)
區別:First,返回序列中的第一條記錄,若是沒有記錄,則引起異常
FirstOrDefault,返回序列中的第一條記錄,若是序列中不包含任何記錄,則返回默認值。
Single,返回序列中的惟一一條記錄,若是沒有或返回多條,則引起異常。
SingleOrDefault,返回序列中的惟一一條記錄,若是序列中不包含任何記錄,則返回默認值,若是返回多條,則引起異常。
4.從LINQ to Objects到LINQ to Entities
解析:查詢語法上LINQ to Objects是一致的。可是他們在執行上卻存在本質的區別。Objects始終是一個CLR對象,LINQ to Objects始終
是在CLR中進行的運算和操做;而LINQ to Entities雖然在編碼上操做集合對象,但最終會被框架轉換爲對具體數據庫表的操做。簡單的說,
在LINQ to Entities中,查詢表達式最終會被轉化成相應的SQL語句。在這個轉化過程當中,from,where,order by,select等部分會相應地
轉化成SQL子句,用到的函數會轉換成相應的SQL函數或運算符,如StartsWith("張"),在SQL Server數據庫中會轉換成Like N'張%'
5.查詢多表數據
方式一:使用導航屬性
方式二:join鏈接查詢
方式三:嵌套查詢子查詢
6.上機練習一(獲取好友分組信息)
(1)當前用戶的全部分組信息
from c in PrivateGroups
where c.OwnerId==6
select c
PrivateGroups
.Where (c => (c.OwnerId == 6))
(2)當前用戶的未分組好友總個數
(from c in FriendRelations
where c.UserId==6 && c.GroupId.HasValue==false
select c).Count()
FriendRelations
.Where (c => ((c.UserId == 6) && (c.GroupId.HasValue == false))).Count()
(3)當前用戶的好友總個數
(from c in FriendRelations
where c.UserId==1
select c).Count()
FriendRelations
.Where (c => (c.UserId == 1)).Count()
上機練習二(獲取分組下的好友)
01.分組編號對應的分組信息
(from c in PrivateGroups
where c.GroupId==4
select c)
PrivateGroups
.Where (c => (c.GroupId == 4))
02.分組編號下的全部好友信息
from c in FriendRelations
where c.UserId==6
&& c.GroupId==20
select c
FriendRelations
.Where (c => ((c.UserId == 6) && (c.GroupId == (Int32?)20)))
上機練習3(按組合條件搜索好友)
實現動做方法,按姓名、性別、城市和家鄉組合條件搜索青鳥朋友網全部用戶,要求
獲取到姓名、編號、是否和當前用戶是好友關係、所屬分組等信息
,支持分頁查詢
第十章 Ajax
1.無刷新刪除分組信息數據
核心:01.先經過EF給用戶展示出一個列表頁面
02.修改對應的View使用,將原有的超連接
改爲一個<img>標籤,而且img標籤設置兩個屬性,
以下<img src="" class="del" delid="@item.GroupId">
03.經過$.post(請求的目標頁面,{id:id},回調函數function(data){
});
04.db.PrivateGroup.Where().SingleOrDefault();
2.根據分組編號獲取當前登陸用戶某個分組下全部的好友信息以及
未分組信息(PartialView實現)
實現步驟:01.咱們都知道,MVC模式最終把全部的請求都歸結到到控制的
某個Action上.這裏咱們點擊頁面左側的一個table中某一個分組的名稱時,
須要在右側的div中展現該分組下的全部好友名稱.
02.首先,在HomeController中書寫一個GetFriendsByGroupId(int? id)
返回的視圖類型再也不是View(),而變成了PartialView().
03.再Index頁面中,將分組名稱從原來的默認形式設置成一個無刷新
超連接,@Ajax.ActionLink("熱點文字","Action名稱","Controller名稱",
路由參數(new{id=@item.GroupId},new AjaxOptions(){
OnScuccess="服務器執行成功後要執行的Js函數",
HttpMethod="請求提交方式",
Confirm="提示是否進行操做的對話框",
UpdateTargetId="要更新的目標區域的id",
LoadingElementId="當網速慢的時候,或者併發量大的時候,用戶
看到的正在加載./...圖片效果.",
}))
LoadingElementId參數注意事項:設定的顯示圖片加載的標籤以下:
<div id="load">
<img src="~/images/01.jpg"/>
</div>
01.先在樣式表中讓id="load"的div隱藏
display:none;
02.當圖標在指定的時間內將數據加載完成後,會自動將div再次自動隱藏.
最後一項目:目標區域的代碼
<div id="mytarget">
//如何調用分佈視圖
@Html.Partial("分佈視圖的名稱",model數據)
</div>
如何加載未分組數據呢?
解析:其實上就是在table最後一個tr後面手動構造一個tr對象.
而且也使用無刷新超連接來進行分組名稱的顯示.其餘內容同上.
3.Json實現某個分組下的好友信息
核心01:什麼是Json?
解析:JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。
它相對於xml格式解析起來更加簡便,比Serialize序列化的數據有更好的
展現效果.
核心02.JSON 名稱/值對(hash ,字典)
解析:JSON 數據的書寫格式是:名稱/值對。
名稱/值對組合中的名稱寫在前面(在雙引號中),值對寫在後面(一樣在雙引號中),中間用冒號隔開:
例如:"firstName":"John"
核心03.JSON 值
JSON 值能夠是:
數字(整數或浮點數)
字符串(在雙引號中)
邏輯值(true 或 false)
數組(在方括號中)
對象(在花括號中)
null
核心04.Json的各類形式
最簡單的形式:{"name":"張靚穎"}
若是想讓服務器打給瀏覽器Json數據, 那麼返回類型要寫成Json(攜帶數據,JsonRequestBehavior.AllowGet)
在使用Json方法的過程當中,會出現循環引用的異常信息,咱們能夠經過
db.Configuration.ProxyCreationEnabled=false解決,或者是經過
db.Configuration.LazyLoadingEnabled=false解決,微軟官方解決能夠經過
blog上的方案,原理是重寫了Json方法的執行流程.
json數據:
[{"UserId":5,"Mail":"yanyan@sina.com","RealName":"唐燕",
"Password":"123456","Gender":"女","Birthday":"\/Date(255110400000)\/","City":null,"HomeCity":null,"Situation":"教員","HeaderImage":"5.jpg","BloodStyle":null,"RegisterTime":"\/Date(1366732800000)\/","GenderPrivate":0,"BirthdayPrivate":0,"CityPrivate":0,"HomeCityPrivate":0,"SituationPrivate":0,"BloodStylePrivate":0,"InitialPrize":2345,"FriendRelation":[],"GroupFriend":[],"EntityState":2,"EntityKey":{"EntitySetName":"UserInfo","EntityContainerName":"FriendsEntities1","EntityKeyValues":[{"Key":"UserId","Value":5}],"IsTemporary":false}}]
解析服務器打到瀏覽器上的Json格式數據
$.each(data, function (i, object) {
$("#FriendList").text("");
$("#FriendList").append(
"<div>" + object.RealName + "</div>" + "<br/>");
});
注意點:當咱們從GetFriendByGroupId轉型成GetFriendByGroupIdJson的時候,必定
要注意AjaxOptions中不能再有UpdateTargetId的值.由於在OnSuccess中已經
指定了要更新的區域信息.
第11章 Forms身份校驗 過濾器() 緩存 錯誤頁
關於Session的配置
什麼是進程內Session
解析:淘寶登錄:StateServer:
<sessionState mode="InProc" customProvider="DefaultSessionProvider" timeout="20">
<providers>
<add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
</providers>
</sessionState>
1.Forms驗證方式
配置步驟:
01.在程序的web.config文件中,
配置以下節點
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />--注意這裏超時的單位爲分鐘
</authentication>
02.登錄成功後向用戶發放身份票據
經過用戶名和密碼斷定
FormsAuthentication.SetAuthCookie(user.UserId.ToString(),false);
03.獲取身份票據進行驗證
if (this.User.Identity.IsAuthenticated)
//驗證經過
{
//獲取寫入的userName
int userId = Convert.ToInt32( this.User.Identity.Name );
//具有權限後的操做代碼...
}
Win7下Cookie的位置
C:\Users\Administrator\AppData\Local\Microsoft\Windows\Temporary Internet Files
Authorize 特性-方便的實現受權
其實Authorize內部也是經過03的步驟實現的
Authorize過濾器
2.過濾器
AOP+面向接口編程
service service.impl
dao dao.impl
過濾器的本質:本質就是一個實現了特定接口或者是父類的特殊類。
我們自定義的過濾器必須知足兩個條件:01.繼承FilterAttribute抽象類
02.必須實現四個接口中的任何一個。
在ASP.NET MVC中,過濾器就是一個繼承自FilterAttribute的類,而且實現了
IActionFilter、IResultFilter、IException或者是IAuthorizationFilter接口
中的任何一個接口。
兩個Demo:如何記錄網站的錯誤日誌(不能記錄404錯誤)。
如何記錄網站的訪問日誌(瀏覽器,IP) 。
在FilterConfig文件中,註冊全局過濾器。
注意FilterAttribute命名空間爲mvc下
public class MYExceptionFilter:FilterAttribute,IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
//記錄錯誤日誌
//01.得講錯誤日誌記錄到當前項目的某個文件中(erroglog.txt)
//02.在服務器上指定該文件的位置
string realpath=filterContext.HttpContext.Server.MapPath(@"~\errorlog.txt");
//03.經過IO流的方式寫入錯誤信息
using (StreamWriter sw = File.AppendText(realpath))
{
sw.WriteLine("時間:{0}",DateTime.Now);
sw.WriteLine("ip地址:{0}",filterContext.HttpContext.Request.UserHostAddress);
sw.WriteLine("控制器:{0}",filterContext.RouteData.Values["Controller"]);
sw.WriteLine("動做方法:{0}",filterContext.RouteData.Values["Action"]);
sw.WriteLine("錯誤信息:{0}",filterContext.Exception.StackTrace);
sw.WriteLine("**********************************************************");
}
}
}
public class SystemOperationListFilter:FilterAttribute,IActionFilter,IResultFilter{
public void OnActionExecuted(ActionExecutedContext filterContext)
{
//當action執行完後執行該方法
string realpath = filterContext.HttpContext.Server.MapPath(@"~\pageList.txt");
//寫入IO流
using (StreamWriter sw=File.AppendText(realpath))
{
sw.WriteLine("時間:{0}",DateTime.Now);
sw.WriteLine("地址:{0}",filterContext.HttpContext.Request.Url);
sw.WriteLine("瀏覽器引擎:{0}", filterContext.HttpContext.Request.UserAgent);
sw.WriteLine("計算機名:{0}",filterContext.HttpContext.Request.UserHostName);
}
}
}
自定義過濾器特性能夠打在三個地方
:
01.Action
02.控制器
03.路由中配置
第三方,api
我們本身的接口
咱們如今努力的學習英文,就是爲了有一天全部外國人都學習中文。考試
IActionFilter,IResultFilter,IExceptionFilter,IAuthorizeFilter
3.談一下設計模式(常見的總共有23種設計模式) AOP IOC
單例模式
簡單工廠模式(不屬於)
工廠模式
抽象工廠
門面模式
適配器模式:可使系統原本存在的兩個絕不相干的類型能夠協同工做。
GOF(設計模式的權威書籍)
大話設計模式
設計模式之禪(Java)
AOP(面向切面編程)
面向切面(AOP)編程,Adapter適配器模式
********************************************06.緩存********************************************
06.緩存
使用緩存的目的就是加快對某種資源的訪問。
併發量比較大的時候:分佈式
本質:SOA+集羣
做用:緩存是一把雙刃劍,優勢:加快網站的訪問速度。由於緩存的數據存在於
應用服務器的內存中,當緩存對象造成後,第二次訪問的時候,不須要再從數據庫
中將數據取到APP服務器上 。這樣速度天然塊。
缺點:01.佔用了服務器的內存,服務器內存是很稀缺的資源。若是對頁面的大量數據
啓用緩存,那麼可能形成服務器崩潰。
02.有一些網站不適合使用緩存技術, 例如股票,天氣等須要實時更新數據的
網站,若是啓用緩存,可能形成網站的數據有延遲不許確。
哪些網站適合緩存,好比噹噹網首頁???
緩存分兩種:
01.對集合的緩存
02.對整個頁面的緩存
緩存通常有兩種方式,若是咱們須要進行更細粒度的控制,好比控制緩存數據(
例如,某個泛型集合,可使用經過在Controller中定義一個屬性來設置緩存數據。
能夠經過以下方式,設置緩存。HttpContext.Cache["key"]=值;
上述方式沒法進行緩存過時設置,因此咱們引入了Add方法和Insert()方法。
Insert方法中能夠設置緩存過時時間,真實開發中,通常使用絕對過時時間。
用法以下:
HttpContext.Cache.Insert(CACHEDUSERS, items, null,System.Web.Caching.Cache.NoAbsoluteExpiration,TimeSpan.FromSeconds(10));
HttpContext.Cache.Insert(CACHEDUSERS, items, null, DateTime.Now.AddSeconds(15),System.Web.Caching.Cache.NoSlidingExpiration);
參數一:key
參數二;value
參數三:緩存依賴,沒有爲null
參數四:過時時間
參數五:設置是絕對過去仍是滑動過時。取值:若是是NoSlidingExpiration,證實是絕對過時,若是是
NoAbsoluteExpiration :滑動過時時間
)
//緩存登錄數據
public const string CHACHEDUSERS = "FriendsUsers";
public List<User> UserList
{
get
{
List<User> list= HttpContext.Cache[CHACHEDUSERS] as List<User>;
if (list==null)
{
list = db.Users.ToList();
HttpContext.Cache.Insert(CHACHEDUSERS, list, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(10));
}
return list;
}
}
緩存頁面:
[OutputCache(Duration=15)] 設置的也是絕對過時時間
絕對過時時間和滑動過時時間:
剛纔咱們設置了15s後過時,那麼從用戶第一次開始訪問,日後數15秒,
就會在15s以後過時
滑動過時時間:從用戶最後一次訪問頁面的時間開始日後推15s。
07.ajax
08.Forms進行網站驗證
09.安全相關
10.過濾器
在ASP.NET MVC中,過濾器就是一個繼承自FilterAttribute的類,或者實現了
IActionFilter、IResultFilter、IException或者是IAuthorizationFilter。
AOP思想:
11.單元測試
****************************************錯誤頁定製************************************************
12.錯誤頁定製
第一種方式:
步驟一:就是在網站的web.config配置文件中,找到
<system.web>節點,在該節點中添加以下代碼。
<customErrors defaultRedirect="~/ErrorPage.htm" mode="On">
<error statusCode="404" redirect="~/FileNotFound.htm"/>
</customErrors>
步驟二:在網站的根目錄下建立對應的靜態錯誤頁
步驟三:重點,必定要對Views/Shared/Error.cshtml文件從新命名,不然自定義的錯誤頁不會顯示。
方式二:針對控制器或者控制器下的某個Action來構建錯誤頁。
在Web.config文件中進行以下配置
<customErrors mode="On">
</customErrors>
** mode的取值:
On表示啓用自定義錯誤
Off表示禁用自定義錯誤
RemoteOnly向遠程客戶端顯示自定義錯誤,而且向本地主機顯示 ASP.NET 錯誤
[HandleError(ExceptionType=Exception,View="Error")]
//默認ExceptionType取值爲Exception,View取值爲Error
public ActionResult Index()
{
//查詢全部的出版社信息
var query = db.Publishers.Select(c=>c);
return View(query);
}
建立一個靜態頁面,位於對應的Controller所在的View文件夾中
************************************************************************************************
指定Order屬性
**:01.若是某個Action設置了多個HandleErrorAttribute,Order屬性能夠用來肯定使用哪一個過濾器.
其值能夠設置爲從-1(最高優先級)到任何正整數之間的整數來標識其優先級,值越大,
優先級別越低.Order屬性遵循如下規則:
*:01.應用到Controller上的過濾器將會自動應用到該Controller的全部Action上.
*:02.若是Controller和Action都應用了HandleErrorAttribute,那麼只要Order屬性值相同,
將會先執行Controller上的過濾器,然後纔會執行Action上的過濾器.
*:03.對於相同Order屬性的過濾器,其執行前後次序不定.
*:04.若是沒有指定Order屬性,則默認爲-1,這意味着該過濾器將比其餘的過濾器優先執行,
除非其餘過濾器指定了Order爲-1.
*:05.若是有多個過濾器可適用,那麼第一個能夠處理該異常的過濾器會被首先調用,
而後針對該異常的處理將會終結.
***********************************************************************************************
********************************在View中獲取異常信息***************************************************************
ASP.NET MVC框架將異常信息存儲在ViewDataDictionary中來傳遞給Error視圖,
該ViewDataDictionary的Model屬性便是ExceptionContext類的一個實例,
這個ViewData有下面幾個鍵:
ActionName:目標Action方法的名稱
ControllerName:目標Controller的名稱
Exception:異常對象.
船停在港灣是很安全的,但那不是造船的目的!
IAuthorizeFilter
IActionFilter
IExceptionFilter
IResultFilter
系統默認過濾器:
[Authorize]
[HandleError]
[OutputCache]
同一個動做方法應用過濾器時,決定執行順序的因素?
解析:01.類過濾器優先於Action
02.同一個Action上的多個過濾器有Order時,Order值越小,執行優先級越高,默認爲-1最高 。
03.在當前的Controller重寫OnActionExecuting時,優先級高於其餘任何經過特性過濾的內容
***************************01.XSS,CSRF攻擊************************************************************
**
問題一:ASP.NET MVC中經常使用的過濾器有哪些?
解析:Authorization Action Result Exception
問題二:應用程序緩存和輸出緩存有什麼區別?
解析:應用程序緩存是對集合數據的緩存,輸出緩存是對整個頁面的緩存。
問題三:同一個動做方法應用過濾器時,決定執行順序的因素?
解析:按Order屬性值從小到達執行。
問題五:解釋CSRF的概念?
解析:CSRF全稱是Cross Site Request Forgery,即跨站請求僞造。簡單地說,就是假冒正常的http請求。
問題六:Moq 在單元測試中有什麼用?
解析:模擬
1.
1.XSS漏洞和防護
XSS攻擊原理:XSS英文全稱Cross-site scripting,即跨站腳本。
首先是惡意用戶向某個網站的頁面植入破壞性代碼,植入的方式,通常是經過表單提交。
授課步驟:經過一個評論Demo來用普通的文本框提交數據,這時候會出現「檢測到存在危險的Request.Form」值。而後咱們不檢查輸入,在Action中進行以下設置。
[ValidateInput(false)],而後咱們換成了eckeditor,
假設登陸頁面有個輸入用戶名和密碼的輸入框,能夠有不少Xss/csrf/注入釣魚網站/SQL
輸入用戶名 : >"'><script>alert(1779)</script>
輸入用戶名: usera>"'><img src="javascript:alert(23664)">
輸入用戶名: "'><IMG SRC="/WF_XSRF.html--end_hig--begin_highlight_tag--hlight_tag--">
輸入用戶名: usera'"><iframe src=http://demo.testfire.net--en--begin_highlight_tag--d_highlight_tag-->
2.CSRF漏洞和防護
你在光大銀行:無關緊要
EMS:
[TestMethod]
public void TestListFriends_UnGrouped()
{
FriendController friendController = new FriendController();
var mock = new Mock<ControllerContext>();
mock.Setup(p => p.HttpContext.User.Identity.Name).Returns("1");
friendController.ControllerContext = mock.Object;
//執行
PartialViewResult result = (PartialViewResult)friendController.ListFriends(-1);
//斷言
Assert.IsNotNull(result);
Assert.IsNotNull(result.ViewBag.Friends);
}
//單元測試
單元測試是由開發人員來測試,主要是對業務方法的測試。測試的核心就是斷言類Assert,
他提供了一堆靜態方法供程序員使用。
不須要提供上下文的:直接建立出一個單元測試項目,添加對被測項目Book的引用。
須要提供上下文的:利用第三方的Moq.dll框架實現
*01.引入被測項目
*02.在測試工程中,建立一個lib文件夾,放入Moq.dll文件,而且添加引用
*03.必定要在測試工程的App.config文件的ConnectionString節點中,添加鏈接字符串
(從被測項目的根目錄的Web.config獲取)
*04.在打有[TestMethod]
//XSS
CSRF:必須在用戶正常登錄網站的前提下實施的。
本質上是在須要提交表單的頁碼隱藏了令牌XXXToken,在控制器的Post方法中,對令牌進行校驗。
在IIS中發佈MVC應用,和以前的ASP.NET方式同樣