ASP.NET MVC 最佳开发实践(1)
?
Model建議 - Model Recommendations
Model是定義業務領域相關的對象,應該包含業務邏輯(對象如何動作和關聯),驗證邏輯(驗證對象的有效值),數據邏輯(數據對象如何持久化),和會話邏輯(跟蹤用戶狀態)。
?
創建獨立的Model項目,在ASP.NET MVC 項目中引用Model程序集。
?
將所有業務邏輯放置在Model中。
如將所有業務邏輯放置在Model項目中,可根據實際業務數據來生成View和Controller。有如下好處:
- 減少重復的業務邏輯。
- 在View中減少業務邏輯,View易于理解。
- 業務邏輯的測試僅僅和Model有關。
?
例如,下面需要顯示用戶的用戶名 – 先顯示Last Name,在View中代碼如下:
<%?if?(String.Compare((string)TempData["displayLastNameFirst"],?"on")?==?0)
?????? {?%>
??????? Welcome,?<%=?Model.lastName%>,?<%=?Model.firstName%>
??? <%?}
?????? else
?????? {?%>
??????? Welcome,?<%=?Model.firstName%>?<%=?Model.lastName%>
??? <%?}?%>
?
然而你需要在每一個地方重復這一邏輯。如將這一業務邏輯放置在Model中,可在Model中添加一個屬性封裝這一邏輯。
public?string?combinedName
{
??? get
??? {
??????? return?(displayLastNameFirst???lastName?+?"?"?+?firstName?:?firstName?+?"?"?+?lastName);
??? }
??? private?set
??? {
??????? ;
??? }
}
這樣,可大大簡化視圖代碼:
<% Welcome, <%= Model.combinedName %> %>
?
將所有驗證邏輯放置在Model中
所有輸入驗證應該在Model層,包括Client-side 驗證。
可使用ModelState 添加驗證檢查,代碼如下所示:
if (String.IsNullOrEmpty(userName))
{
?? ModelState.AddModelError("username", Resources.SignUp.UserNameError);
}?
?
不過,更好的辦法是使用 System.ComponentModel.DataAnnotations,在Model類的屬性上添加attribute,如下所示:
public class User
{
?? [Required(ErrorMessageResourceName = "nameRequired", ErrorMessageResourceType = typeof(Resources.User))]
?? public String userName { get; set; }
?????? ...
}
?
為數據訪問定義接口
接口用來暴露數據訪問類的方法,強化ASP.NET MVC 的松散耦合設計。
可考慮使用Entity Framework 或 LINQ to SQL 創建對數據庫的訪問類,Entity Framework 和 LINQ to SQL 都支持存儲過程。
?
將所有會話邏輯放置在Model中。
?
View 建議 - View Recommendations
View用來展示Model數據,Controller負責選擇View。業務邏輯不屬于View,Model負責業務邏輯。View非常靈活,如Model的View可通過HTML顯示,同樣的Model也可通過XML 視圖來呈現。
?
將HTML放置在View和Partial View中(不要在Controller中)
默認的ASP.NET視圖引擎提供了如下視圖文件:HTML View(.aspx),Partial HTML View(.ascx)和Master page(.master)
如下視圖演示了對partial view的調用:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
…
??? Below is a list of items submitted by <b>
<%= Html.Encode(ViewData["name"]) %></b>.
??? <p>
???
??? ...
??? <div id="items">
??????? <% Html.RenderPartial("ItemsByName");%>
??? </div>???
</asp:content>
?
Partial view(ItemsByName.ascx)如下所示:
<%@ Control Language="C#"?%>
…
??????? <% foreach (Seller.Controllers.Items item in (IEnumerable)ViewData.Model)
?????????? { %>
??????????? <tr>
??????????????? <td>
??????????????????? <%= Html.Encode(item.title)%>
??????????????? </td>
??????????????? <td>
??????????????????? <%= Html.Encode(item.price)%>
??????????????? </td>??????????????
??????????? </tr>???????
??????? <% } %>
??????? </table>
????? <% } %>
Partial View 是一個強大的擴展和重用機制。你可在不同的地方包含相同的View,不必編寫重復的代碼。
?
在View中使用ViewData訪問數據
ASP.NET 提供了如下機制在View模板中訪問數據:
ViewData.Model 對象 – 在Controller的action方法中,在return語句中傳入一個Model對象(return View(myModelObject))。
ViewData Dictionary – 在action方法中存入數據(ViewData[“key”] = value),接著在View中方法相同的dictionary。
在可能的情況下,應該是一ViewData Model,而不是ViewData 來訪問數據,因為Model 提供了類型安全。此外,你應在View模板中,使用數據訪問機制,而不是Request / Session 來訪問。
如需要顯示一個對象的多個屬性,可使用ViewData.Model,并創建一個強類型View。針對seller詳細頁面,seller類有name、phone、address、email等等屬性,在呈現View之前,你可在Controller中對ViewData.Model 賦值seller對象實例。但是如果是一些零散的數據,如page#、用戶名和current time,則一般使用ViewData字典。
?
在使用模型綁定(Model bingding)時,避免在view中訪問數據。
在Controller 中訪問數據庫,在執行View之前,將從數據庫中檢索的數據復制給輕量的View Model對象,這樣,輕量的View Model對象不必在視圖執行時檢索數據。
?
使用(自動生成)客戶端驗證
從ASP.NET MVC 2 開始,可以很容易添加客戶端驗證。
(1) 如前所述,在Model層中添加數據驗證邏輯;
(2) 確保項目中Scripts目錄有如下javascript 文件:MicrosoftAjax.js 和 MicrosoftMvcValidation.js;
(3) 在表單提交頁面,添加如下代碼:
<script src="<%= Url.Content("~/Scripts/MicrosoftAjax.js") %>" type="text/javascript"></script>
?
<script src="<%= Url.Content("~/Scripts/MicrosoftMvcValidation.js") %>" type="text/javascript"></script>
?
(4) 在表單中添加如下代碼:
<% Html.EnableClientValidation(); %>
?
現在如果編輯表單內容,當輸入值不合格時,客戶端馬上進行驗證提醒。
?
在模板中插入server-side 注釋
在View模板中使用服務端注釋,在HTML呈現時,會剔除。
如下是server-side注釋:
<%-- This is a server side template comment --%>
?
不要在View模板中使用HTML 注釋,因為這些注釋會呈現在web瀏覽器中,可被用戶看到。
?
使用HTMLHelper 擴展方法。
System.Web.Mvc.Html 類中包含了很多有用的HTML 擴展方法。
Form 表單生成(BeginForm)
輸入字段生成(checkbox、hidden、radio button、textbox)
鏈接URL生成(ActionLink)
XSS保護(Encode)
?
盡可能使用這些HTML擴展方法,如下是使用route table創建一個鏈接:
<%= Html.ActionLink(“Home page”, “Default”) %>
后續相關文章,可參考如下鏈接:
?
ASP.NET MVC 最佳開發實踐(2)ASP.NET MVC 最佳開發實踐(3)
?
?
英文原文鏈接:
Best Practices for ASP.NET MVC
http://blogs.msdn.com/b/aspnetue/archive/2010/09/17/second_2d00_post.aspx
?
?
?
?
轉載于:https://www.cnblogs.com/rickie/archive/2011/05/03/2035877.html
總結
以上是生活随笔為你收集整理的ASP.NET MVC 最佳开发实践(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP 和 HTTPS 协议
- 下一篇: asp.net ajax控件工具集 Au