微冷的雨ASP.NET MVC之葵花寶典(MVC)

微冷的雨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都屬於系統對象數據庫

 

設置Cookiejsp仍是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)

  1. 命名參數  Test(name:」張靚穎」)
  2. 特殊類型

  Var:隱式.類型推斷  第一個=不能給null,必須給一個肯定的值,這樣才能推斷出=左側變量的類型

  Dynamic:動態類型  能夠憑空的點出一個自身不存在方法,編譯時不進行類型檢查,在運行時會報錯.

  1. 匿名類  var stu= new {Name=」XX」}

  匿名.類中的屬性是隻讀的.

  1. 可空類型

  Int? num=5;

     Int result=Num??0;

  1. 三層  DAL  BLL   UI   (Model)

依賴關係

DALModel

BLLModel DAL

UIBLL 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.如何在ControllerView中共享數據

   方案二:5

       ViewData

        ViewBag

       TempData

上面三種的場景簡單數據類型

       ViewData.Model  4

     View(Model)   5

 

強類型的複雜類型須要傳遞model使用方式45

  3.經過看MVC源碼剖析了一下爲何ViewData這個容器能夠實現從ControllerView的數據共享.

 解析: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來完成應用程序和數據庫之間的數據傳遞.

  BookShopEntiesDBContext(EF5.0)

   EF4.0繼承自ObjectContext

03.Business Model  ViewModel

 業務Model:10個字段

視圖Model:3個字段

04.因爲咱們的驗證標籤直接打在生成的實體類的屬性上可能形成驗證特性標籤的丟失(從新生成實體類)

 考慮一下如何解決???

 解析:助手類

  步驟:

  1. 在項目根目錄的Models文件夾中新建一個名稱爲ViewModel的文件夾,
  2. ViewModel文件夾中定義一個和實體模型同名的部分(Partial),而且將命名空間和實體模型的命名空間保持一致.
  3. User類中再定義一個名稱爲UserViewModel的類,將驗證標籤打在該類的屬性上.
  4. 而後,User部分類上方經過特性來進行以下操做.

[MetaDataType(typeof(UserViewModel))]

Public partial class User

{

    

}

  1. EF保存數據

解析:Edmx模型中,有一個名稱爲BookShopPlusEntities的類,這個類中會自動根據數據庫中的表名生成一個DBSet<User>  Users{get;set;}集合,而後在Controller中就能夠經過db.Users.Add(entity)

  1. Razor視圖啓動文件

  .master再也不有,推出了_Layout.cshtml

Bundle技術:X在能夠將1000css樣式表文件合成一次

  結論:若是您選取了Razor視圖引擎,那麼不管是否啓用Layout視圖,都要從_ViewStart.cshtml執行.

  1. mvc是如何生成前臺校驗標籤的

其實上前端校驗仍是交給了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>

  1. 其餘常見的驗證標籤

Required();必填項

Compare()比較:確認密碼

     StringLength();限定字符格式

     Range(這裏課本上是錯誤的,不能經過它來驗證日期範圍)

     RegularExpression(@」^$」)

 

 

  1. ModelState進行後臺校驗

ModelState.IsValid:true,代表後臺全部的實體校驗均經過

  如何將錯誤信息扔到ValidationSummary

   ModelState.AddModelError(「和Index.chhtml中的表單元素name保持」,」用戶名存在」)

 

 

補充遠端校驗:[Remote]  System.web.MVC;

補充:經過隱式的ajax請求來實時校驗用戶名是否存在

核心就是每次產生校驗的時候,調用Controller中的一個方法,只不過該方法返回的是

Json數據.

 

  

  1. 淘寶分頁

 擴展方法三要素:

  靜態類  靜態方法  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進行文件上傳

  步驟101.構造上傳文件的表單

  @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

    參見msdnhttp://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,MSLSSDL)

    Object Services:就至關於封裝增刪改查的高級類。例如調用AddObject就能夠實現新增操做。

    Entity Client:至關於ADO.NET中的SqlClient  ConnectionCommand

    ADO.NET Provider:至關於數據庫的驅動程序

   EDM MetaData(CSDL,MSLSSDL)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(未修改)客戶的緩存資源是最新的, 要客戶端使用緩存

404404 Not Found 未找到資源

500:服務器內部錯誤!

 

    ***重點五:壓縮文件技術:Bundle技術:

問題:請求一個頁面Index,頁面上引用了10個外部CSS,須要發幾回請求?

解析:發送11次請求,請求頁面的文本一次請求。請求10CSS須要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()區別

 解析:這裏以FirstFirstOrDefault進行說明,其餘相似。 

1First:取序列中知足條件的第一個元素,若是沒有元素知足條件,則拋出異常 

2FirstOrDefault:取序列中知足條件的第一個元素,若是沒有元素知足條件,

則返回默認值(對於能夠爲null的對象,默認值爲null,對於不能爲null的對象,

int,默認值爲0) 

 

  區別:First,返回序列中的第一條記錄,若是沒有記錄,則引起異常

  FirstOrDefault,返回序列中的第一條記錄,若是序列中不包含任何記錄,則返回默認值。

  Single,返回序列中的惟一一條記錄,若是沒有或返回多條,則引起異常。

  SingleOrDefault,返回序列中的惟一一條記錄,若是序列中不包含任何記錄,則返回默認值,若是返回多條,則引起異常。

 

4.LINQ to ObjectsLINQ 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 );

       

        //具有權限後的操做代碼...

   

   }

  Win7Cookie的位置

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的類,而且實現了

IActionFilterIResultFilterIException或者是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

    我們本身的接口

 

    

    咱們如今努力的學習英文,就是爲了有一天全部外國人都學習中文。考試 

 

     IActionFilterIResultFilterIExceptionFilterIAuthorizeFilter

   

   

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的類,或者實現了

IActionFilterIResultFilterIException或者是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取值爲ExceptionView取值爲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.若是ControllerAction都應用了HandleErrorAttribute,那麼只要Order屬性值相同,

將會先執行Controller上的過濾器,然後纔會執行Action上的過濾器.

*03.對於相同Order屬性的過濾器,其執行前後次序不定.

*04.若是沒有指定Order屬性,則默認爲-1,這意味着該過濾器將比其餘的過濾器優先執行,

除非其餘過濾器指定了Order-1.

*05.若是有多個過濾器可適用,那麼第一個能夠處理該異常的過濾器會被首先調用,

而後針對該異常的處理將會終結.

***********************************************************************************************

 

********************************View中獲取異常信息***************************************************************

    ASP.NET MVC框架將異常信息存儲在ViewDataDictionary中來傳遞給Error視圖,

    該ViewDataDictionaryModel屬性便是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.XSSCSRF攻擊************************************************************

 

 

 

**

 

問題一: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方式同樣

相關文章
相關標籤/搜索