欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
蛙蛙推薦:ASP.NET MVC學(xué)習筆記
<!--[endif]-->

ASP.NET MVC 1.0發(fā)布有段兒時(shí)間了,剛發(fā)布不久的時(shí)候試用了一下,做了一個(gè)簡(jiǎn)單的BBS,現在總結一些經(jīng)驗和小技巧和大家分享。網(wǎng)上關(guān)于ASP.NET MVC的系列教程有好幾個(gè),所以就不從頭開(kāi)始介紹了,結尾處給大家推薦了幾個(gè)鏈接,需要的話(huà)可以從頭系統的看看。

1、ASP.NET MVC介紹及與ASP.NET WebForm的區別

剛開(kāi)始為了搞清楚ASP.NET MVC到底值不值得用,翻來(lái)覆去想了一個(gè)多禮拜,看了好多資料和評論,最后決定還是值得一用。MVC不是一個(gè)簡(jiǎn)單的設計模式,更像一種架構模式,或者一種思想,剛開(kāi)始一聽(tīng)MVC想到的就是模板引擎,NVelocity,StringTempleate等,但感覺(jué)如果只是為了用模板這種獨立的前臺設計方式,沒(méi)必要用ASP.NET MVC,大多數情況用Repeaterk控件和自定義控件兒就能做到,而且ASPX頁(yè)面上本來(lái)就可以寫(xiě)c#代碼,一些比較復雜的界面表現邏輯用普通的WebForm也能實(shí)現,其實(shí)ASP.NET MVCVIEW部分默認用的還是aspx的解析器。ASP.NET MVCView部分讓你寫(xiě)一些大型的,布局復雜的網(wǎng)站更方便,更底層,更直接,很受對css,js很熟悉的開(kāi)發(fā)者的歡迎。

當你理解了MVC的思想后,會(huì )發(fā)現ASP.NET MVC的好處真正在于ControllerAction,你寫(xiě)一段代碼能很明確的知道是在處理什么請求,畢竟web程序處理的是一個(gè)一個(gè)的http請求,不像windows桌面程序,基于事件驅動(dòng)更直觀(guān)。ASP.NET MVCController讓你寫(xiě)一些web api或者rest風(fēng)格的接口很方便(以前可能要用HttpHandler來(lái)做),這些Controller只負責提供數據(具體的ActionResult類(lèi),如JsonResult,JavascriptResult等)給使用者,比如一個(gè)Ajax調用,或者View層。

至于Model層,我看網(wǎng)上大多數人是用LINQ TO SQL實(shí)現的,畢竟使用起來(lái)很簡(jiǎn)單,設計好表,用LINQ 設計器往vs.net里一拖就能用了。而且本身就是強類(lèi)型的,再在自動(dòng)生成的代碼上加一些分部方法,就可以實(shí)現數據的有效性驗證等。還有就是對LINQ做的Model進(jìn)行數據持久化和查詢(xún)的時(shí)候更方便,直接用DbContext一個(gè)類(lèi),增刪改查全能搞定。

有得就有舍,ASP.NET MVC雖然提供了先進(jìn)的思想和一些便利,但ASP.NET以前的一些東西不能用了,比如以前自己寫(xiě)的一些服務(wù)器控件兒不能用了,WebPart,皮膚,各種數據綁定控件等都不能用了,但Master頁(yè)還能用,Asp.net Ajax control toolkit(服務(wù)端)也不能用了,但asp.net ajax library(客戶(hù)端js庫)還能繼續使用,基于頁(yè)面和目錄的授權不能用了(因為現在沒(méi)頁(yè)面,只有view了),但MemberShipForms身份驗證還是支持的。標準WebForm的生命周期變了,好些事件沒(méi)了,現在你可以寫(xiě)一些攔截器(Action攔截器、Result攔截器和Exception攔截器)來(lái)影響請求的處理過(guò)程,還有一些區別,總之失去的東西,都有變通的方法能找吧回來(lái)。

2、linq to sql如何獲取插入語(yǔ)句產(chǎn)生的標識列的值?

其實(shí)很簡(jiǎn)單,把對象插入數據庫后,直接取值就行了,如下BBSPost是一個(gè)實(shí)體類(lèi),其中PostID在數據庫里是自增列。

var db = new BBSDbContext(connstr);

BBSPost post = new BBSPost()

post.PostUser = User.Identity.Name;

post.PostTime = DateTime.Now;

db.BBSPosts.InsertOnSubmit(post);

db.SubmitChanges();

int postid = post.PostID; //這里就能取到標識列的值。

 

3、ASP.NET MVC里在請求提交后如何后維持滾動(dòng)條位置?

WebForm里再簡(jiǎn)單不過(guò)了,在web.config里配置MaintainScrollPositionOnPostBack=true就搞定了,但在MVC里就不行了。我們知道了原理后,可以自己實(shí)現,其實(shí)就是在提交表單或者滾動(dòng)條滾動(dòng)的事件里捕獲當前滾動(dòng)條的位置,把數值放在一個(gè)隱藏域里,提交給服務(wù)端,服務(wù)端應答后,從隱藏域里取出滾動(dòng)條的位置,用js操縱滾動(dòng)條滾動(dòng)到上次的位置。

我們先在View里寫(xiě)一個(gè)隱藏域,如下

 <%= Html.Hidden("scroll", ViewData["scrool"])%>

然后在處理客戶(hù)端請求的action里給ViewData里存儲一下提交上來(lái)的值(從FormCollection里?。?。

public ActionResult reply(BBSPost post, FormCollection coll) {

         ...

         ViewData["scroll"] = coll["scroll"];

         ...

         return View("show_post",posts);

}

這樣頁(yè)面提交后隱藏域里就會(huì )保存著(zhù)提交前滾動(dòng)條的位置,然后我們在用JQuery寫(xiě)一些邏輯實(shí)現最終的效果。

<script type="text/javascript">

    $(function() {

        $(document).scroll(function() {

        //在滾動(dòng)條滾動(dòng)的時(shí)候更新隱藏域里滾動(dòng)條的位置值,經(jīng)測試不支持IE8,汗

            $("#scroll").val(document.documentElement.scrollTop);

        });

        $("form").submit(function() {

        //在表單提交的時(shí)候更新隱藏域里滾動(dòng)條的位置值

            $("#scroll").val(document.documentElement.scrollTop);

            return true;

        });

        //document.load事件里取出隱藏域的值,并設置滾動(dòng)條的位置

        document.documentElement.scrollTop = $("#scroll").val();           

    });

</script>

4、驗證用戶(hù)輸入

數據有效性的驗證基本上哪個(gè)程序都躲不了,LINQ ASP.NET MVC的配合,讓數據驗證的實(shí)現也很方便。

LINQ TO SQL設計器自動(dòng)生成的類(lèi)是一個(gè)分部類(lèi),就是半塊兒的類(lèi),你可以寫(xiě)一個(gè)分步類(lèi),在自動(dòng)生成的類(lèi)上加一些擴展的方法,如下我們在LINQ實(shí)體類(lèi)BBSPost上加了一個(gè)GetRuleViolations方法,一個(gè)IsValid屬性,其中GetRuleViolations方法驗證給實(shí)體類(lèi)賦的值的有效性,用yield關(guān)鍵字返回一個(gè)枚舉器,這里可以寫(xiě)你自己的數據有效性驗證邏輯。

IsValid屬性?xún)炔空{用GetRuleViolations方法,如果返回的枚舉器的Count不是0的話(huà),表示數據有效性驗證不通過(guò)。

另外為了方式LINQ TO SQL往數據庫里寫(xiě)入無(wú)效數據,我們給OnValidate分布方法加了兩行代碼,在數據有效性驗證不通過(guò)的情況下寫(xiě)數據庫之前拋出異常。

public partial class BBSPost {

    public bool IsValid {

        get { return (GetRuleViolations().Count() == 0); }

    }

    public IEnumerable<RuleViolation> GetRuleViolations() {

        if (String.IsNullOrEmpty(Title))

            yield return new RuleViolation("標題必須輸入", "Title");

        if (String.IsNullOrEmpty(Content))

            yield return new RuleViolation("內容必須輸入", "Content");

        yield break;

    }

    partial void OnValidate(ChangeAction action) {

        if (!IsValid)

            throw new ApplicationException("Rule violations prevent saving");

    }

}

RuleViolation是一個(gè)輔助類(lèi),很簡(jiǎn)單。

public class RuleViolation {

    public string ErrorMessage { get; private set; }

    public string PropertyName { get; private set; }

    public RuleViolation(string errorMessage) {

        ErrorMessage = errorMessage;

    }

    public RuleViolation(string errorMessage, string propertyName) {

        ErrorMessage = errorMessage;

        PropertyName = propertyName;

    }

}

在寫(xiě)action的時(shí)候,捕獲SubmitChanges操作的異常,然后給ModelState里添加自定義驗證邏輯的異常,ModelState會(huì )把添加進(jìn)去的異常傳遞給View層,供View層使用。

try {

    var db = new BBSDbContext(GlobalHelper.Conn);

    post.PostUser = User.Identity.Name;

    //其它賦值操作

    db.BBSPosts.InsertOnSubmit(post);

    db.SubmitChanges();

    ModelState.Clear();

}

catch (Exception ex) {

    ModelState.AddModelErrors(post.GetRuleViolations());

    ModelState.AddModelError("exception", ex);

}

默認的ModelState沒(méi)有AddModelErrors方法,只有AddModelError方法,我們是后來(lái)給他加了一個(gè)擴展方法,如下

public static class ModelStateHelpers {

    public static void AddModelErrors(this ModelStateDictionary modelState, IEnumerable<RuleViolation> errors) {

        foreach (RuleViolation issue in errors) {

            modelState.AddModelError(issue.PropertyName, issue.ErrorMessage);

        }

    }

}

View層使用了Html.ValidationMessage方法在合適的位置輸出錯誤描述,如果View呈現的時(shí)候ModelState里有錯誤的話(huà),會(huì )自動(dòng)顯示相應的錯誤描述,代碼示例如下。

<p>

    <label for="Title">

        標題:</label>

    <%= Html.TextBox("Title", null, new { style = "width:700px;" })%>

    <%= Html.ValidationMessage("Title") %>

</p>

<p>

    <label for="Content">

        內容:</label>

    <%= Html.TextArea("Content", null, new { style = "width:700px;height:100px;" })%>

    <%= Html.ValidationMessage("Content")%>

</p>

5、LINGQ TO SQL的分頁(yè)

SQLSERVER 2005有很強悍的分頁(yè)函數,LINQ TO SQL對其有很好的支持,IQueryable<T>SkipTake方法最終就生成分頁(yè)的SQL,先寫(xiě)如下的一個(gè)幫助類(lèi)(取自NerdDinner),這個(gè)類(lèi)的屬性很簡(jiǎn)單,見(jiàn)名知意,就不介紹了。

public class PaginatedList<T> : List<T> {

    public int PageIndex  { get; private set; }

    public int PageSize   { get; private set; }

    public int TotalCount { get; private set; }

    public int TotalPages { get; private set; }

    public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize) {

        PageIndex = pageIndex;

        PageSize = pageSize;

        TotalCount = source.Count();

        TotalPages = (int) Math.Ceiling(TotalCount / (double)PageSize);

        this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize)); //這句會(huì )停止延遲加載,把數據加載到內存里

    }

    public bool HasPreviousPage {

        get {

            return (PageIndex > 0);

        }

    }

    public bool HasNextPage {

        get {

            return (PageIndex+1 < TotalPages);

        }

    }

}

使用起來(lái)很簡(jiǎn)單,LINQ TO SQL得到一個(gè)IQueryable后,再用其New一個(gè)PaginatedList就表示一個(gè)已分頁(yè)的數據集了

var posts = from post in db.BBSPosts

    where post.CategoryID == id && post.ParentID == 0

    orderby post.PostID descending

    select post;

const int pageSize = 10;

var pagePosts = new PaginatedList<BBSPost>(posts, page ?? 0, pageSize);

return View(pagePosts);

posts是用linq to sql生成的一個(gè)IQueryable<BBSPost>對象,這時(shí)候SQL語(yǔ)句并沒(méi)有執行,會(huì )延遲執行,再new一個(gè)PaginatedList<BBSPost>的時(shí)候會(huì )對其生成的SQL語(yǔ)句進(jìn)行修改,最后把pagePosts傳遞給view層用就行了,View層我們使用了強類(lèi)型的View,如下

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"

         Inherits="System.Web.Mvc.ViewPage<SimpleBBS.Helpers.PaginatedList<SimpleBBS.Models.BBSPost>>" %>

頁(yè)面上要顯示上一頁(yè),下一頁(yè)的鏈接,寫(xiě)起來(lái)也很簡(jiǎn)單

<div class="pagination">

    <% if (Model.HasPreviousPage) { %>

    <%= Html.RouteLink("上一頁(yè)",

                                           "Default",

                           new { page=(Model.PageIndex-1) }) %>

    <% } %>

    <% if (Model.HasNextPage) { %>

    <%= Html.RouteLink("下一頁(yè)",

                                           "Default",

                           new { page = (Model.PageIndex + 1) })%>

    <% } %>

</div>      

 

6、查看LINQ TO SQL生成的SQL語(yǔ)句?

有人懷疑LINQ TO SQL的性能問(wèn)題,認為它生成的語(yǔ)句不靠譜,其實(shí)它生成的語(yǔ)句都是參數化查詢(xún),一般的基于主鍵或者索引列的查詢(xún)及大多數更新操作性能應該不會(huì )比手寫(xiě)SQL差,如果還是不放心的話(huà),可以把LINQ TO SQL生成的SQL打印出來(lái),以避免性能查的語(yǔ)句產(chǎn)生。

如下代碼

var db = new BBSDbContext(conn);

var posts = from post in db.BBSPosts

        where post.CategoryID == 1 && post.ParentID == 0

        orderby post.PostID descending

        select new {post.PostID, post.Title, post.Content};

db.Log = Response.Output; //跟蹤自動(dòng)生成的SQL語(yǔ)句

rpt1.DataSource = posts;

rpt1.DataBind(); //只有真正執行使用數據的語(yǔ)句時(shí),SQL查詢(xún)才會(huì )執行,在這之前語(yǔ)句只是語(yǔ)句,自動(dòng)延遲執行的。

會(huì )在頁(yè)面上看到LINQ TO SQL生成的SQL語(yǔ)句

SELECT [t0].[PostID], [t0].[Title], [t0].[Content] FROM [dbo].[bbs_Post] AS [t0] WHERE ([t0].[CategoryID] = @p0) AND ([t0].[ParentID] = @p1) ORDER BY [t0].[PostID] DESC -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [0] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1

如果改成如下分頁(yè)方式

var db = new BBSDbContext(conn);

var posts = from post in db.BBSPosts

          where post.CategoryID == 1 && post.ParentID == 0

          orderby post.PostID descending

          select post;

db.Log = Response.Output;

rpt1.DataSource = posts.Skip(1 * 5).Take(5);

rpt1.DataBind();

會(huì )輸出如下SQL

SELECT [t1].[CategoryID], [t1].[PostID], [t1].[ParentID], [t1].[Title], [t1].[Content], [t1].[PostUser], [t1].[PostTime] FROM ( SELECT ROW_NUMBER() OVER (ORDER BY [t0].[PostID] DESC) AS [ROW_NUMBER], [t0].[CategoryID], [t0].[PostID], [t0].[ParentID], [t0].[Title], [t0].[Content], [t0].[PostUser], [t0].[PostTime] FROM [dbo].[bbs_Post] AS [t0] WHERE ([t0].[CategoryID] = @p0) AND ([t0].[ParentID] = @p1) ) AS [t1] WHERE [t1].[ROW_NUMBER] BETWEEN @p2 + 1 AND @p2 + @p3 ORDER BY [t1].[ROW_NUMBER] -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1] -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [0] -- @p2: Input Int (Size = 0; Prec = 0; Scale = 0) [5] -- @p3: Input Int (Size = 0; Prec = 0; Scale = 0) [5] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1

可以看到這些查詢(xún)用的都是參數化查詢(xún),不是拼SQL,而且還用了ROW_NUMBER函數,LINQ TO SQL還是比較了解SQLSERVER的。

7、設置某個(gè)Action需要身份認證?

因為基于頁(yè)面的授權不能使用了,我們只好對某個(gè)Action進(jìn)行授權,比如要回復帖子的話(huà)需要進(jìn)行登錄,那么就在replyaction上加上需要身份驗證的屬性修飾,如下

[AcceptVerbs(HttpVerbs.Post), Authorize]

public ActionResult reply(BBSPost post, FormCollection coll) {

這種方式是以AOP注入方式實(shí)現的,更多的攔截器示例,或者想寫(xiě)自己的攔截器可以google些資料看看。

8、如何把用戶(hù)提交的表單數據轉成強類(lèi)型。

我們都知道網(wǎng)頁(yè)上提交的數據包括Form里和QueryString,在服務(wù)端取出來(lái)都是string類(lèi)型的,在asp時(shí)代,我們需要一個(gè)一個(gè)的處理參數,在ASP.NET MVC里就很方便了,比如你有一個(gè)BBSPost類(lèi),有TitleContentCategoryId 3個(gè)屬性,而表單上有兩個(gè)文本框TitleContent,地址欄參數里有一個(gè)CategoryId,你可以直接在action里取到一個(gè)BBSPost類(lèi),而且屬性都給你填充好了,不用你取出一個(gè)一個(gè)的stringnew一個(gè)BBSPost類(lèi),再轉類(lèi)型賦值等一系列操作了,如下

public ActionResult reply(BBSPost post, FormCollection coll) {}

第一個(gè)參數會(huì )自動(dòng)填充成強類(lèi)型,第二個(gè)參數可以取出原始的表單提交的數據。如果你想了解更多的表單數據和強類(lèi)型數據的綁定,細節,可以查查DefaultModelBinder是如何工作的。

9、給HTMLHelper加擴展方法。

ASP.NET MVC里的一個(gè)最佳實(shí)踐就是給HTMLHelper加一些常用的擴展方法以供View層方便使用,不要到處寫(xiě)幫助類(lèi),比如在顯示帖子的時(shí)候要格式化帖子成HTML格式,我們寫(xiě)了如下的擴展方法

public static class HtmlHelperExtension {

    public static string Text2Html(this HtmlHelper helper, string input) {

        input = input.Replace(" ", " ");

        input = input.Replace("\r\n", "<br />");

        input = input.Replace("\t", "   ");

        return input;

    }

}

view上先引用擴展方法所在的命名空間

<%@ Import Namespace="SimpleBBS.Helpers" %>

然后擴展方法就能使用了,如下

<%= Html.Text2Html(Html.Encode(item.Content)) %>

 

10、如何定位腳本和CSS的位置

如果我們目錄級別特別多,把腳本,樣式表等放在一個(gè)固定的目錄后,在特定的子目錄訪(fǎng)問(wèn)這些資源路徑可能不一致,在WebForm的時(shí)候只有服務(wù)端控件才能使用~語(yǔ)法,無(wú)論是部署在站點(diǎn)根目錄還是虛擬目錄,~都能表示應用的根目錄,在ASP.NET MVC里我們可以用Url.Content來(lái)使用~,如下

<script src="<%=Url.Content("~/Scripts/jquery-1.3.2.min.js")%>" type="text/javascript"></script>  

參考鏈接

一步一步學(xué)習ASP.NET MVC 1.0創(chuàng )建NerdDinner 范例程序

http://forum.entlib.com/Default.aspx?g=posts&t=476

ASP.NET MVC 1.0學(xué)習筆記

http://blog.csdn.net/hzzasdf/archive/2009/05/16/4191439.aspx

從零開(kāi)始學(xué)習ASP.NET MVC 1.0

http://www.cnblogs.com/zhangziqiu/archive/2009/02/27/ASPNET-MVC-1.html

ASP.NET MVC案例教程》索引貼

http://www.cnblogs.com/leoo2sk/archive/2008/11/02/1325084.html

Repository模式

http://www.cnblogs.com/carysun/archive/2009/03/20/Repository.html

LINQ to SQL語(yǔ)句入門(mén)篇

http://kb.cnblogs.com/zt/linq/list/42463/

一步一步學(xué)LINQ TO SQL

http://kb.cnblogs.com/zt/linq/list/42687/

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
學(xué)習 ASP.NET MVC (第二回)實(shí)戰篇
ASP.NET MVC3 系列教程
ASP.NET MVC的JavaScriptResult
How ASP.NET MVC Works?
ASP.NET MVC 3 (一) 新的視圖引擎Razor
LINQ體驗系列文章導航
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久