ASP.NET MVC 最佳开发实践(1)

本文提供了一些代码设计准则,目标是帮助ASP.NET MVC 开发人员创建可靠的应用程序,当然,你可根据实际应用程序选择合适的标准。本文由EntLib.com 小组翻译,欢迎分享和交流ASP.NET MVC 项目开发设计思路。

 

Model建议 - Model Recommendations

Model是定义业务领域相关的对象,应该包含业务逻辑(对象如何动作和关联),验证逻辑(验证对象的有效值),数据逻辑(数据对象如何持久化),和会话逻辑(跟踪用户状态)。

 

创建独立的Model项目,在ASP.NET MVC 项目中引用Model程序集。

 

将所有业务逻辑放置在Model中。

如将所有业务逻辑放置在Model项目中,可根据实际业务数据来生成ViewController。有如下好处:

  • 减少重复的业务逻辑。
  • 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。业务逻辑不属于ViewModel负责业务逻辑。View非常灵活,如ModelView可通过HTML显示,同样的Model也可通过XML 视图来呈现。

 

HTML放置在ViewPartial 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 viewItemsByName.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 对象Controlleraction方法中,在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类有namephoneaddressemail等等属性,在呈现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

输入字段生成(checkboxhiddenradio buttontextbox

链接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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大咖 | 斯坦福教授骆利群:为何人脑比计算机慢1000万倍,却如此高效?

大数据文摘出品作者&#xff1a;骆利群编译&#xff1a;王一丁、Shan Liu、小鱼AI源于人类大脑的结构&#xff0c;并尝试达到与大脑相当的能力。那么二者的差异究竟在哪里&#xff1f;斯坦福大学神经生物学教授骆利群&#xff08;Liqun Luo&#xff09;认为&#xff0c;大脑性能…

业务架构·应用架构·数据架构实战~战略驱动的业务架构设计

1、什么是业务架构&#xff08;BA&#xff09; 业务架构是企业治理结构、商业能力与价值的正式蓝图。 业务架构明确定义企业的治理结构、业务能力、业务流程、业务数据。其中&#xff0c;业务能力定义企业做什么&#xff0c;业务流程定义企业怎么做。 业务能力定义企业做什么…

Python 操控手机 APP

From&#xff1a;https://www.cnblogs.com/7758520lzy/p/11994776.html Python 控制雷电模拟器&#xff1a;https://blog.csdn.net/zerglurker/article/details/102931511 python 控制手机 python控制雷电模拟器 经常看到用 Python 操作手机 APP 的项目&#xff0c;例如抖音…

Log4Net 全方位跟踪程序运行

前端日子自己写了一个简单的日志跟踪程序&#xff0c;现在目前正在做的一个项目中使用以便于跟踪程序异常和运行状况&#xff0c;但是被否认了&#xff01;可能是没有权威性&#xff0c;于是自己总结了一下Log4net日志跟踪系统&#xff0c;这里分享大家学习一下。当然写这个文章…

面对5G,华为、中兴及三大运营商怎么布局?

来源&#xff1a;亿欧摘要&#xff1a;面对即将到来的新机遇——5G&#xff0c;各大相关通信厂商纷纷大力布局&#xff0c;尤其以华为和中兴为主的通信设备商和三大运营商移动、联通和电信。面对5G&#xff0c;看其如何布局&#xff1f;什么是5G&#xff1f;5G是第五代移动通信…

业务架构·应用架构·数据架构实战~业务驱动的应用架构设计

1、什么是应用架构 应用架构是一组应用系统及其交互关系的描述&#xff0c;其中的每个应用系统都是一个“逻辑功能组”&#xff0c;用于支撑业务功能、管理数据资产。 支撑业务架构中&#xff0c;具体业务功能、业务流程的要求。 支撑数据架构中&#xff0c;具体数据资产的操…

Android 之 四大组件、六大布局、五大存储

Android 之四大组件、六大布局、五大存储&#xff1a;https://blog.csdn.net/shenggaofei/article/details/52450668 Android 四大组件、五大存储、六大布局&#xff1a;https://blog.csdn.net/xiankog/article/details/81702119 Android四大基本组件介绍与生命周期&#xff…

vb光环褪去java、c/c++/c#成编程主流

evansdata公司最近的一份调查显示&#xff0c; 运用微软的visualbasic软件停止开发的技术人员人数有明显的下降。 但微软方面则不认同这一说法。 广告&#xff1a;d_textevansdata公司位于美国圣克鲁斯&#xff0c; 他们在北美对超过430位开发人员停止了调查&#xff0c; 从而对…

互联网大脑进化简史,类脑智能巨系统产生与兴起

前言2018年以来&#xff0c;在短短的6个月里&#xff0c;包括360安全大脑、阿里ET大脑、华为城市神经网络、腾讯超级大脑、浪潮企业大脑、上海城市大脑、滴滴交通大脑、AIbee行业大脑不断涌现。在大数据&#xff0c;人工智能之后&#xff0c;类脑智能巨系统正在成为科技新的热点…

业务架构·应用架构·数据架构实战~业务驱动的数据架构设计

1.什么是数据架构&#xff08;DA&#xff09; 定义一&#xff1a;数据架构是通过对齐企业战略得到的数据资产管理蓝图。具体而言&#xff0c;该蓝图用于指导如何分析数据需求、如何做好相应设计。 定义二&#xff1a;数据架构描述企业的 A、主要数据类型及其来源&#xff1b…

10款交互设计原型开发工具(转)

所谓“工欲善其事&#xff0c;必先利其器”&#xff0c;尽管小米加步枪可以也可以打败敌人&#xff0c;但如果朱棣有了坦克装甲部队&#xff0c;那岂不是更容易平定安南&#xff1f; 关于原型开发工具&#xff0c;各有各的使用习惯&#xff0c;有人喜欢axure、photoshop&#x…

安卓逆向_3 --- 篡改apk名称和图标、修改包名实现应用分身、修改资源去广告、去除re管理器广告

From&#xff1a;https://www.bilibili.com/video/BV1UE411A7rW?p7 Android 中 adb shell dumpsys 相关命令&#xff1a;https://blog.csdn.net/fengyulinde/article/details/78798055 adb shell dumpsys 命令是用于打印出当前系统信息 (更切确的说是dumpsys命令&#xff0c;…

Nature:科学家成功解读大脑构建的分子机制

来源&#xff1a;生物谷摘要&#xff1a;日前&#xff0c;一项刊登在国际杂志Nature上的研究报告中&#xff0c;来自伦敦大学国王学院的研究人员通过研究发现了大脑构建的基本过程&#xff0c;这或许能帮助理解诸如自闭症和癫痫症等神经发育障碍背后的分子机制。日前&#xff0…

谈判底层逻辑~谈判中的难点梳理

谈判三大困境&#xff1a;抗拒、僵持、僵局 1.抗拒--总防备 eg.买电影票不买两边有人的&#xff0c;和邻居不打招呼 产生防备的原因&#xff1a; 陌生/不熟悉 太多/太复杂 生意上就是&#xff0c;抗拒&#xff0c;不要靠近.... 怎么破冰&#xff1f; Ta不愿见面&#xff…

(原创)浅谈BUG资产,用例资产的作用

注意了&#xff0c;这里提的是如何写BUG和CASE&#xff0c;不是讨论如何去发现BUG或是如何去设计用例 比如同样的BUG或是需求&#xff0c;有些人写的BUG和用例&#xff0c;既简单明了&#xff0c;又一目了然 对于一个公司来说&#xff0c;以前的项目的BUG不能扔一边不管了…

安卓逆向_4 --- Java 学习

菜鸟教程 ----- Java 教程&#xff1a;https://www.runoob.com/java/java-tutorial.html 廖雪峰 ----- Java 教程&#xff1a;https://www.liaoxuefeng.com/wiki/1252599548343744 W3Cschool ----- Java 教程&#xff1a;https://www.w3cschool.cn/java/java-tutorial.html …

安卓逆向_5 --- Android 学习

Android 之 四大组件、六大布局、五大存储&#xff1a;https://blog.csdn.net/freeking101/article/details/105377197 安卓&#xff08;Android&#xff09;动态创建多个按钮并添加监听事件&#xff1a;https://www.jb51.net/article/88036.htm 安卓按钮添加监听的三种方法&am…

华为公布车联网进展:年内将覆盖10万网联车

来源&#xff1a;车云摘要&#xff1a;实际上&#xff0c;华为进军汽车业的“野心”在于&#xff0c;提供车联网的相关解决方案。近年来&#xff0c;华为一直有向其他领域扩充的计划与布局&#xff0c;此前&#xff0c;其将与汽车厂商合作造车的传闻也一直不绝于耳。对此&#…

NDoc 用户指南

NDoc 用户指南 http://www.uml.org.cn/net/200702271.asp#811转载于:https://www.cnblogs.com/stalwart/archive/2011/05/31/2065177.html

杨强:人工智能在企业的落地是一门大学问

来源&#xff1a;图灵人工智能摘要&#xff1a;人工智能到现在已经 60 多年&#xff0c;几起几落&#xff0c;它的兴衰也是围绕着 “AI是不是可以落地” 进行的。杨强香港科技大学计算机和工程学系主任国际人工智能联合会IJCAI理事长第四范式首席科学家杨强&#xff1a;一个AI&…