整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          七天學會ASP.NET MVC (1) - 深入理解

          七天學會ASP.NET MVC (1) - 深入理解MVC

          多 ASP.NET 開發人員開始接觸 MVC,都認為 MVC 與 ASP.NET 完全沒有關系,是一個全新的 Web 開發。

          事實上 ASP.NET 是創建 WEB 應用的框架,而 MVC 是一種能夠用更好的方法來組織并管理代碼的體系,所以可以稱之為 ASP.NET MVC。

          因此,我們可以將原來的 ASP.NET 稱為 ASP.NET Webforms,新的 MVC 稱為 ASP.NET MVC

          ASP.NET Webforms

          ASP.NET 在過去的十幾年里,已經服務并成功實現Web 應用的開發。那么,我們先了解一下為什么ASP.NET能夠如此流行,并成功應用?

          微軟編程語言從 VB 開始就能夠成為流行并廣泛應用,都源于其提供的強大的 Visual studio 能夠進行可視化的編程,實現快速開發。

          使用 VS 時,開發人員能夠通過拖拽 UI 元素,并在后臺自動生成這些界面的代碼,稱為后臺代碼。在后臺代碼中,開發人員可以添加操作這些UI元素的邏輯代碼。

          因此微軟的可視化 RAD 架構體系有兩方面組成,一方面是 UI,一方面是后臺代碼。

          ASP.NET WebForms 存在的問題

          • 響應時間

          如圖所示,每一次 WebForms 請求都有轉換邏輯,運行并轉換服務器控件為 HTML 輸出。如果頁面使用表格,樹形控件等復雜控件,轉換就會變得很糟糕,HTML 輸出也是非常復雜的。由于這些不必要的轉換從而增加了響應時間。上圖是 ASP.Net MVC 和 Webforms 的響應時間對比,我們會發現 Webforms 的響應時間是 MVC 的兩倍左右。

          • 帶寬消耗

          ASP.NET 開發人員都非常熟悉 Viewstates,因為它能夠自動保存 post 返回的狀態,減少開發時間。但是這種開發時間的減少會帶來巨大的消耗,Viewstate增加了頁面的大小。

          從上圖中,我們可以看到與 MVC 對比,Viewstate 增加了兩倍的頁面存儲。

          MVC是怎么彌補這些問題的?

          Asp.Net MVC 由 Model,View,Controller 三部分組成。Controller 中包含后臺代碼邏輯,View 是ASPX,如純 HTML 代碼,Model 是中間層。

          不使用服務器控件,直接編寫 HTML 代碼,并且將后臺代碼遷移到獨立的類庫中,是 MVC 解決 Webforms 問題的方法。

          直接編寫HTML代碼的好處在于,web設計者可以與開發人員緊密合作及時溝通,設計人員也可以使用他們喜愛的設計工具來設計HTML代碼。

          將后臺代碼遷移到獨立的簡單的類庫,執行效率也會大大提高。

          ASP.NET Webform 和 MVC 比較,如上圖所示。

          深入理解 ASP.NET MVC 今天就講到這里,后續還會更新 “七天學會 ASP.NET MVC” 的其它篇章。

          敬請期待!

          相關開發工具

          要進行 ASP.ET MVC 的開發,不但需要具備 MVC 的知識,還需要高效的工具來幫助開發。

          使用 ComponentOne Studio Enterprise 中提供的 ComponentOne Studio ASP.NET MVC,您能獲取快速的輕量級控件來滿足用戶所有需求,大大減輕工作量。

          快人一步,免費試用

          如果您想試用 ComponentOne Studio ASP.NET MVC,請聯系我們:

          微信:GrapeCityDT

          郵件:marketing.xa@grapecity.com

          官網:www.gcpowertools.com.cn

          關于葡萄城控件

          葡萄城是一家跨國軟件研發集團,專注控件領域近30年,是全球最大的控件提供商,也是微軟認證的金牌合作伙伴

          數據輸入需要一些驗證時,每個人都需要一點幫助。今天,我們提供了一種方法,根據用戶的輸入給用戶一些數據提示。

          獲得高級管理人員手冊的重要趨勢、技巧和戰略,以競爭和贏得數字經濟。

          當數據輸入需要一些驗證時,每個人都需要一點幫助。今天,我們提供了一種方法,根據用戶的輸入給用戶一些數據提示。

          在最近的一個項目中,我被要求創建一個帶有“永久占位符”的文本框。

          whaaaaa嗎?

          所以我決定繼續跟進,詢問他們是什么意思。

          “你知道……因此,當用戶不知道公司的正確名稱時,他們可以得到提示。

          “當他們打字時,會在文本框中顯示一個可能的公司名稱?!?/p>

          在搜索之后,我從Geoff Graham的CSS技巧中找到了這個例子。這正是他們所談論的,但無濟于事。

          看到的第一個名字嗎?他們輸入第一個字母,建議把剩下的字母作為突出的文本顯示出來。

          它所做的唯一一件事就是給我提供我所需要的功能。

          GIF動畫是最終的目標,但如何做到這一點是一個難題。

          要求自動填充

          讓我們檢查一下如何讓這個文本框起作用。

          1. 當他們開始鍵入公司名稱時,他們可能會停下來考慮拼寫,并要求提示。

          2. 我們應該檢查數據庫的部分公司名稱。

          3. 在文本框中顯示高亮顯示或灰色顯示的建議。

          4. 一旦他們對自己的輸入感到滿意,他們就會點擊tab進入下一個領域,他們的公司名稱就會被接受。

          1 2和4并不難。3是這個問題。

          為什么?

          如果我們想要使用灰色的文本,而不是突出顯示的文本,那么文本框中就沒有一種方法可以將文本顯示為一種顏色,而另一種顏色的建議則是另一種顏色。

          高亮文本可能是實現這一點的更好方法,但是當我們到達它的時候,我們會跨越那個灰色的橋。

          概述

          首先,我們需要一個文本框。

          @using (Html.BeginForm())

          {

          <div class="form-group">

          <div class="row">

          <div class="col-md-4">

          @Html.Label("Company", "Company:")

          <span class="autofill">

          @Html.TextBox("CompanyTextBox", String.Empty, new

          {

          @class="form-control input-sm"

          })

          </span>

          <p class="help-block">Enter the company name (i.e. Apple, Microsoft).</p>

          </div>

          </div>

          </div>

          }

          繁榮!完成了!

          進行呼叫!

          接下來,我們需要一個API來根據輸入檢索我們的公司。我使用一個假的數據庫調用創建了一個服務控制器(您可以根據您認為合適的方式修改它)。

          我添加了一個名為ServicesController的新項目(Web API控制器類)。

          using System.Collections.Generic;

          using System.Linq;

          using Microsoft.AspNetCore.Mvc;

          namespace AutofillDemo

          {

          [Route("api/[controller]")]

          public class ServicesController : Controller

          {

          // GET api/<controller>/5

          [HttpGet("{id}")]

          public List<string> Get(string id)

          {

          var partialCompanyName=id;

          // Create a repository to access your database here.

          // For now, we'll create a small list

          // of companies for demonstration purposes.

          var list=new List<string>

          {

          "Apple",

          "Microsoft",

          "Google",

          "MicroCenter",

          "Microtek",

          "MicroSystems"

          };

          var company=list.OrderBy(e=> e).FirstOrDefault(e=>

          e.StartsWith(partialCompanyName));

          // if company is null, use an empty string.

          // Else, use the company. :-)

          return new List<string> { company ?? "" };

          }

          }

          }

          我從API中刪除了附加的HTTP謂詞,因為我們現在不需要它們。

          由于我們已經構建了web服務,您可以通過運行應用程序并在瀏覽器中輸入http://localhost:/api/Services/Micro,來測試它。我們的服務應該還回來?!癕icroCenter。”

          完美!

          一些(JavaScript)組裝要求

          現在我們已經有了HTML和web服務,我們需要JavaScript來實現這個奇跡。

          我們的一個要求是,我們需要給用戶足夠的時間來完成輸入。一旦他們停下來,給他們一兩秒鐘想想。

          對于這個功能,我們需要在某個延遲之后執行一個函數。

          我們還需要一個函數來突出(或選擇)其余的字符,這樣我們就可以繼續輸入提示信息了。

          $.fn.delayKeyup=function (n, t) {

          var i=0;

          return $(this).keyup(function () {

          clearTimeout(i);

          i=setTimeout(n, t);

          }),

          $(this)

          };

          $.fn.selectRange=function (start, end) {

          return this.each(function () {

          if (this.setSelectionRange) {

          this.focus();

          this.setSelectionRange(start, end);

          } else if (this.createTextRange) {

          var range=this.createTextRange();

          range.collapse(true);

          range.moveEnd('character', end);

          range.moveStart('character', start);

          range.select();

          }

          });

          };

          當然,您需要jQuery來實現這些功能。

          selectRange檢查我們在if語句中使用哪個瀏覽器。

          讓我們設置事件來使用這些函數。

          $(function() {

          var company=$("#CompanyTextBox");

          $(company).delayKeyup(function() {

          var partialCompanyName=$(company).val();

          // if there's nothing there, don't do anything.

          if (partialCompanyName.length===0) {

          return false;

          }

          // grab company names based on the partial

          $.getJSON("/api/Services/" + partialCompanyName)

          .done(function(data) {

          if (data) {

          var returnedCompany=data[0];

          // Remaining highlighted characters

          $(company).val(returnedCompany);

          $(company).selectRange(partialCompanyName.length,

          returnedCompany.length);

          }

          })

          .fail(function() {

          console.log("error");

          });

          }

          , 1000);

          });

          獲取用戶輸入后,我們檢查它是否為空。如果是的話,停止你正在做的事情,然后返回false。

          在驗證輸入之后,我們通過我們的API請求返回公司名稱。

          我們將返回的公司名稱設置在文本框中,并根據用戶的輸入設置所選字符的范圍。

          底部的1000是1秒超時。你可以自行決定,但不要讓他們等待太久。

          結論

          雖然我們可以使用建議下拉,但我覺得這是一個挑戰,給用戶提供提示,而不需要點擊下拉菜單。

          這種特殊的技術讓我思考——我們可以通過把突出顯示的字符(如本文開頭所提到的),讓它們變得更透明,就像一個占位符嗎?

          怎么可能呢?我有個主意,請繼續。

          你認為你知道如何做透明的占位符嗎?我們需要CSS嗎?在下面發表你的評論,讓我們討論一下。

          系列文章將為大家介紹如何實現和應用模板,模板允許您自定義控件部分(標題、單元格、項目等)的呈現方式。

          DevExtreme Complete Subscription官方最新版免費下載試用,歷史版本下載,在線文檔和幫助文件下載-慧都網

          使用 *Template() 方法定義模板,例如:

          • DataGridColumnBuilder.CellTemplate - 為DataGrid控件中的列單元格指定模板。
          • ListBuilder.ItemTemplate - 為 List 控件中的項目指定模板。
          • PopupBuilder.ContentTemplate - 為 Popup 控件的內容指定模板。

          模板語法

          模板由 Razor 標記和可以使用參數的 ERB 樣式構造 (<% %>) 組成,要定義模板,請在控件的 *Template(RazorBlock templateContent) 方法中使用 @<text>? 塊。

          注意:Razor VB:當您使用 @<text> 塊時:

          • 用@Code/End Code 附上控件配置;
          • 使用 Render() 結束控件配置。

          Razor C#

          @(Html.DevExtreme().List()
          .DataSource(DataSource)
          .ItemTemplate(@<text>
          <div><%- Name %></div>
          </text>)
          )

          Razor VB

          @Code
          Html.DevExtreme().List() _
          .DataSource(DataSource) _
          .ItemTemplate(Sub()
          @<text>
          <div><%- Name %></div>
          </text>
          End Sub) _
          .Render()
          End Code

          List 控件綁定到以下數據源:

          C#

          object[] DataSource=new[] {
          new { Name="John" },
          new { Name="Jane" }
          };

          VB

          Dim DataSource={
          New With {.Name="John"},
          New With {.name="Jane"}
          }

          您還可以在模板中使用 @Html,例如嵌套控件或訪問標準 HTML 幫助程序。

          如果模板很短且不使用 Razor 構造(以 @ 開頭),則可以使用帶有 String 參數的 *Template 方法的速記重載:

          Razor C#

          @(Html.DevExtreme().List()
          .DataSource(DataSource)
          .ItemTemplate("<div><%- Name %></div>")
          )

          Razor VB

          @(Html.DevExtreme().List() _
          .DataSource(DataSource) _
          .ItemTemplate("<div><%- Name %></div>")
          )

          外部模板

          您可以在控件聲明之外定義模板,這在以下情況下很有用:

          • 模板很大;
          • 想重用一個模板;
          • 需要嵌套模板(下面的代碼演示了如何將 List 控件嵌套在 Popup 控件中)。

          Razor C#

          @(Html.DevExtreme().Popup()
          .ID("myPopup")
          .ContentTemplate(@<text>
          @Html.Partial("_MyPopupContentTemplate")
          </text>)
          )

          Razor VB

          @Code
          Html.DevExtreme().Popup() _
          .ID("myPopup") _
          .ContentTemplate(Sub()
          @<text>
          @Html.Partial("_MyPopupContentTemplate")
          </text>
          End Sub) _
          .Render()
          End Code

          Shared/_MyPopupContentTemplate.cshtml

          @(Html.DevExtreme().List()
          .DataSource(ListDataSource)
          .ItemTemplate(@<text>
          <div><%- Name %></div>
          </text>)
          )

          Shared/_MyPopupContentTemplate.vbhtml

          @Code
          Html.DevExtreme().List() _
          .DataSource(ListDataSource) _
          .ItemTemplate(Sub()
          @<text>
          <div><%- Name %></div>
          </text>
          End Sub) _
          .Render()
          End Code

          使用命名模板。

          1. 在 using(Html.DevExtreme().NamedTemplate(...)) 塊中定義模板。
          2. 在 *Template(TemplateName name) 方法中指定模板名稱。

          Razor C#

          @(Html.DevExtreme().Popup()
          .ID("myPopup")
          .ContentTemplate(new TemplateName("myPopupContentTemplate"))
          )
          
          @using (Html.DevExtreme().NamedTemplate("myPopupContentTemplate")) {
          @(Html.DevExtreme().List()
          .DataSource(ListDataSource)
          .ItemTemplate(@<text>
          <div><%- Name %></div>
          </text>)
          )
          }

          Razor VB

          @Code
          Html.DevExtreme().Popup() _
          .ID("myPopup") _
          .ContentTemplate(New TemplateName("myPopupContentTemplate")) _
          .Render()
          End Code
          
          @Using (Html.DevExtreme().NamedTemplate("myPopupContentTemplate"))
          @Code
          Html.DevExtreme().List() _
          .DataSource(ListDataSource) _
          .ItemTemplate(Sub()
          @<text>
          <%- Name %>
          </text>
          End Sub) _
          .Render()
          End Code
          End Using

          可以在聲明控件或布局的同一 Razor 文件中聲明命名模板。

          注意:

          • 模板名稱在整個應用程序中應該是唯一的。
          • 命名模板應該在頂層定義,它們不能在另一個模板中聲明。

          使用 Razor @helper 指令將模板標記提取到函數中。

          Razor C#

          @(Html.DevExtreme().Popup()
          .ID("myPopup")
          .ContentTemplate(@<text>
          @MyPopup_List()
          </text>)
          )
          
          @helper MyPopup_List()
          {
          @(Html.DevExtreme().List()
          .ItemTemplate(@<text>
          @MyPopup_List_Item()
          </text>)
          )
          }
          
          @helper MyPopup_List_Item()
          {
          <text>
          <div><%- Name %></div>
          </text>
          }

          Razor VB

          @Code
          Html.DevExtreme().Popup() _
          .ID("myPopup") _
          .ContentTemplate(Sub() Write(MyPopup_List())) _
          .Render()
          End Code
          
          @helper MyPopup_List()
          @(Html.DevExtreme().List() _
          .ItemTemplate(Sub() Write(MyPopup_List_Item()))
          )
          End Helper
          
          @helper MyPopup_List_Item()
          @<text>
          <div><%- Name %></div>
          </text>
          End Helper

          DevExtreme

          DevExtreme擁有高性能的HTML5 / JavaScript小部件集合,使您可以利用現代Web開發堆棧(包括React,Angular,ASP.NET Core,jQuery,Knockout等)構建交互式的Web應用程序。從Angular和Reac,到ASP.NET Core或Vue,DevExtreme包含全面的高性能和響應式UI小部件集合,可在傳統Web和下一代移動應用程序中使用。 該套件附帶功能齊全的數據網格、交互式圖表小部件、數據編輯器等。


          主站蜘蛛池模板: 波多野结衣一区二区免费视频| 在线免费视频一区二区| 无码一区二区波多野结衣播放搜索| 日本高清不卡一区| 日本丰满少妇一区二区三区| 蜜桃视频一区二区三区在线观看 | 亚洲视频一区网站| 亚洲色无码一区二区三区| 国产成人精品一区二区三区无码| 在线视频精品一区| 麻豆亚洲av熟女国产一区二| 久久国产精品无码一区二区三区| 亚洲啪啪综合AV一区| 在线精品一区二区三区电影| 日美欧韩一区二去三区| 国产精品亚洲综合一区在线观看 | 在线电影一区二区| 国产一区二区三区在线2021| 无码中文字幕乱码一区| 韩国精品一区视频在线播放| 国产爆乳无码一区二区麻豆 | 国产精品亚洲一区二区三区在线观看| 亚洲AV无码一区二区三区人| 色综合视频一区中文字幕| 精品少妇一区二区三区视频| 精品国产精品久久一区免费式| 久久久久人妻精品一区三寸蜜桃 | 国产在线一区二区三区在线| 上原亚衣一区二区在线观看| 国产AV天堂无码一区二区三区| 亚洲V无码一区二区三区四区观看| 北岛玲在线一区二区| 濑亚美莉在线视频一区| 中文字幕无线码一区2020青青| 亚洲一区综合在线播放| 国产成人精品一区二三区在线观看| 成人精品一区久久久久| 精品久久综合一区二区| 精品国产一区二区三区久久影院 | 日本不卡一区二区三区| 日本免费电影一区二区|