Pages: 3/9 First page Previous page 1 2 3 4 5 6 7 8 9 Next page Final page [ View by Articles | List ]
Apr 2

 

新建HtmlHelpers类

image

添加如下代码

using System.Web.Mvc;  

namespace MvcMusicStore.Helpers

{    

    public static class HtmlHelpers    

    {        

        public static string Truncate(this HtmlHelper helper  , string input, int length)        

        {            

            if (input.Length <= length)            

            {                

                return input;            

            }            

            else            

            {                

                return input.Substring(0, length) + "...";            

            }        

        }    

    }


这是一个截断字符串长度的函数。

这样使用

// 先添加命名空间@using MvcMusicStore.HtmlHelpers// 调用@Html.Truncate(item.Title, 25)

效果

image

原文地址:http://ninofocus.com/2011/03/23/add-custom-mothod-to-helper/

Apr 2

本教程的目的是解释如何为 ASP.NET MVC 应用程序中的控制器编写单元测试。我们将讨论如何创建三种不同类型的单元测试。您将了解如何测试控制器操作返回的视图、如何测试控制器操作返回的视图数据,以及如何测试一个控制器操作是否重定向到另一个控制器操作。

创建测试控制器

我们首先创建要测试的控制器。程序清单 1 中包含名称为 ProductController 的控制器。

程序清单 1 ProductController.cs

                                    
using System;
            using System.Web.Mvc;            

namespace Store.Controllers
            {
                public class ProductController : Controller
                {
                      public ActionResult Index()
                      {
                          // Add action logic here
                          throw new NotImplementedException();
                      }

            

          public ActionResult Details(int Id)
                      {
                          return View("Details");
                      }
                }
            }

            

HomeController 包含两个操作方法,名称为 Index() 和 Details()。两个操作方法都返回一个视图。请注意, Details() 操作接受名称为 Id 的参数。

测试控制器返回的视图

假设要测试 ProductController 是否返回正确的视图。希望确保当激活 ProductController.Details() 操作时,返回 Details 视图。程序清单 2 中的测试类包含一个单元测试,用于测试由 ProductController.Details() 操作返回的视图。

程序清单 2 ProductControllerTest.cs

                                    
using System.Web.Mvc;
            using Microsoft.VisualStudio.TestTools.UnitTesting;
            using Store.Controllers;            

namespace StoreTests.Controllers
            {
                [TestClass]
                public class ProductControllerTest
                {
                      [TestMethod]
                      public void TestDetailsView()
                      {
                          var controller = new ProductController();
                          var result = controller.Details(2) as ViewResult;
                          Assert.AreEqual("Details", result.ViewName);
                      }
                }
            }

            

程序清单 2 中的类包含名称为 TestDetailsView() 的测试方法。此方法包括三行代码。第一行代码创建一个 ProductController 类的新实例。第二行代码激活控制器的 Details() 操作方法。最后一行代码检查 Details() 操作返回的是否是 Details 视图。

Apr 2
MVC (ModelViewController)把一个web应用分成了三个部分:model view和controller。ASP.NET MVC框架提供了一个可以代替asp.net web窗体的基于mvc的应用。
  ASP.NET MVC概述·mvc的优点:
  1.通过把项目分成model view和controller,使得复杂项目更加容易维护。
  2.没有使用view state和服务器表单控件,可以更方便的控制应用程序的行为
  3.应用程序通过controller来控制程序请求,可以提供丰富的url重写。
  4.对单元测试的支持更加出色
  5.在团队开发模式下表现更出众
  ASP.NET MVC概述·web窗体的优点:
  1.采用事件驱动模式来控制应用程序请求,由大量服务器控件支持
  2.采用页面控制机制,可以为单个页面添加事件处理函数。
  3.使用view state和服务器端页面,使管理页面状态信息更加轻松。
  4.对人数较少的想使用服务器端控件的开发团队,使用起来更加方便
  5.开发起来比mvc模式要轻松简单一些
  ASP.NET MVC概述mvc框架特色:
Apr 2

有一只企鹅首先发现地球暖化、冰山在融化,回来告诉其它企鹅,却没有任一只企鹅愿意相信;因为企鹅们觉得现在生活过得很好,都不想费心思考如何改变、改变何时会来临,因此仍每天做例行性的工作,不愿去研究别人的观点。「有时人们会抗拒改变,其实只是不想改变;但是愿意接收新观念的技术人员,通常会活得比较久」。本帖只提供 MVC Pattern 的观念和架构介绍,仅供未接触过 MVC Framework 的 .NET 技术人员作为参考之用,以评估是否要深入学习或在将来的项目导入。

常在网络上,看到有网友误认 MVC 和 3-Tier (三层架构) 是类似的东西:
http://topic.csdn.net/u/20090405/21/97a137ff-2105-4117-a0c3-39d7f0f1c952.html
http://topic.csdn.net/u/20090415/13/9ebe5011-c56b-47e6-9f89-40b70896a041.html

但二者本质上是完全不同的概念,如下:

3-Tier 或 N-Tier 的架构,中间层可能包含 EJB, Enterprise JavaBeans (J2EE),或 .NET Enterprise Services、Remoting、WCF:
Client (WebPage) -- [ BLL (业务逻辑层) -- DAL (数据访问层) ] (Web Server) -- 数据来源或数据库
Client (WebPage) -- [ BLL (业务逻辑层) -- DAL (数据访问层) ] (Web Server + Application Server) -- 数据来源或数据库

MVC 则为:
Model (模型) - 包含 BLL、DAL。View 和 Controller 都依赖于 Model,但是 Model 既不依赖于 View,也不依赖于 Controller,这是分离的主要优点之一
View (视图) - 仅负责生成输出 (UI)。以 ASP.NET MVC 来说,不再有 Code-behind 这种 .aspx.cs 文件,亦无 runat="server" 标记、form 标记、控件声明、事件处理
Controller (控制器) - 控制整个系统的 workflow、运作逻辑、错误处理、身分验证和授权、用户输入数据验证、…等等


总的来讲,微软的 ASP.NET MVC Framework 是为了让 ASP.NET 更适合中、大型的项目,能统一规划、控管整个网站系统的流程 (用 Controller 处理),并更有效地分工开发、日后维护 (避免许多 WebForm 里重复出现相同功能的自定义函数)、管控某个功能在修改后对系统整体的影响,并将不同的功能作更明确地切割,让不同专长的技术人员各司其职,也顺便提高了代码的可读性,便于测试 (TDD, test -driven development) (减少直接绑到用户界面中的代码量) [4],并达到「松散耦合 (loosely coupled)」,让组件易于更换和重复使用。但也因此,ASP.NET 程序员必须先改变过去,把很多业务逻辑、输入验证、页面切换…等杂七杂八的功能,全部写在 Code-Behind (aspx.cs) 里的旧习惯。

ASP.NET MVC provides a framework that enables you to easily implement the model-view-controller (MVC) pattern for Web applications. This pattern lets you separate applications into loosely coupled, pluggable components for application design, processing logic, and display. ASP.NET MVC also greatly facilitates test -driven development (TDD).

事实上,MVC Pattern 的发明已有二十多年,其与再衍生的观念和框架 (MVP),在 Java / J2EE / Struts 的一些 Framework 早已行之多年。MVC 模式的结构如下 [4]:

View (JSP) 只纯粹用来生成输出,不涉及数据来源的访问、事件处理、各种逻辑处理和运算工作。因此更适合大型项目的分工,把这层完全交由美工人员制作 (而非程序员兼美工和排版)。此层如同 ASP.NET 中的 .aspx 前台页面,亦即 UI (User Interface)。(不再有页面初始化和加载方法,也没有事件处理程序,除了基类声明以外没有任何内容,基类声明为 System.Web.Mvc.ViewPage)

Model (JavaBean、EJB 组件) 用来存放独立且可重复使用的组件,包括:数据来源 (数据库) 的访问、商业逻辑的代码,并应与 View 作完整地切割,以便保留系统日后扩充或改写时的弹性。此层如同 ASP.NET 中的 App_Code 文件夹中的自定义类、DataSet (.xsd)、TableAdapter、…等等。

Controller (Java Servlet) 用来控制整个网站处理的「流程」,负责协调 View 和 Model 之间的流程传递和转向,也要管理和指派由哪个文件去接收用户所提出的「请求 (request)」,亦即由它决定要展现哪一个 aspx 文件给用户。当用户从浏览器送出 request 时 (例若用鼠标单击页面中的控件,或输入数据后单击 Button 的提交、输入 URL 网址、点选 hyperlink…等等),Controller 里定义的某些 method 会判断要交由 Model 中的哪些运算逻辑去处理,然后再判断要将处理结果传回哪一个 View 去显示出来。此外,Controller 还可包含错误处理、授权、输入验证…等功能的代码,集中统一处理,以避免传统 WebForm 里大量重复的代码。但说穿了,Controller 事实上只是一个自定义类,搭配一些 Attribute (特性)。而 Controller 也是目前 ASP.NET 所欠缺的部分。


图 1 MVC (Model 2) 架构的运作方式,可与下图 2 的 ASP.NET MVC 项目相互对应

Apr 1
微软官方:http://technet.microsoft.com/zh-cn/library/dd492619
HtmlHelper类的辅助和扩展方法:

(1)ActionLink  生成一个特定的控制器行为连接
            <%=Html.ActionLink("Edit", "Edit", "Book", new { id = Model.ID }, new { @class = "BookDetail"})%>
            具体说明:
            Edit,为linkText,具体而言就是显示的字符串
            Edit,对应为ActionName;
          Book,为Controller;
          new { id = Model.ID },为生成元素的id定义;
          new { @class = “BookDetail” },则为元素添加了tag要素
(2)AntiForgeryToken 生成一个隐藏的表单字段,可与ValidateAntiForgeryToken属性一起使用以确保Request没有被修改
            具体说明:
                 如果你要保护你的应用程序的多个形式的相互独立,AntiForgeryToken 将生成不同的防伪标志
                  <%= Html.AntiForgeryToken("someArbitraryString") %>
                  [ValidateAntiForgeryToken(Salt="someArbitraryString")]
                 public ViewResult SubmitUpdate()
                 {
                           // ... etc
                  }

(3)AttributeEncode 数据属性编码 :提供了HtmlAttributeEncode功能
                具体说明:
                 <%= Html.AttributeEncode(Url.Action("Login")) %>

(4)DropDownList   基于一对键值对生成DropDownList(绑定数据:http://blog.csdn.net/yh_bxhl/article/details/6107500)
               具体说明:
             Html.DropDownList(    string name,    IEnumerable<SelectListItem> selectList,    string optionLabel,    object htmlAttributes)
             name:选择元素的名称,绑定到元素视图的模型属性
             selectList:选项列表,
             optionLabel:类似与“Select …”   可选的默认的标签
             htmlAttributes:可添加的属性
             使用方法          
代码
        List<SelectListItem> items = new List<SelectListItem>();
         items.Add( new SelectListItem { Text = "Swimming", Value = "1" });
         items.Add(new SelectListItem { Text = "Cycling", Value = "2", Selected = true });
         items.Add(new SelectListItem { Text = "Running", Value = "3" });
        ViewData["ListItems"] = items;

           <%= Html.DropDownList("ListItems") %>
(5)Encode 编码字符串,以防跨站脚本攻击  
   使用方法
            < %=Html.Encode("< script src=/"j . JS/">< div background='javascript:alert('');'/>")%>
    编码结果
             &lt;script src=&quot;j . JS&quot;&gt;&lt;/script&gt;&lt;div background='javascript:alert('');'/&gt;

(6)Hidden 生成表单隐藏字段
            <%= Html.Hidden("SearchType", 1) %>
            前台源代码:
             <input id="SearchType" name="SearchType" type="hidden" value="1" />
(7)ListBox  基于列键值对生成下拉框
          使用方法:  
代码
<%= Html.ListBox(
                    "optionsList",
                     new []
                         {
                                 new SelectListItem
                                     {
                                             Text = "Option 1",
                                             Value = "opt1"
                                     },
                                  new SelectListItem
                                     {
                                             Text = "Option 2",
                                             Value = "opt2"
                                     },
                                  new SelectListItem
                                     {
                                             Text = "Option 3",
                                             Value = "opt3"
                                     }
                },
               "Choose an option"  
             ) %>

             前台源代码:
                <select Length="16" id="optionsList" multiple="multiple" name="optionsList">
                      <option value="opt1">Option 1</option>
                      <option value="opt2">Option 2</option>
                      <option value="opt3">Option 3</option>
                </select>


(8)Pasword  生成表单密码字段
           使用方法:
                   <%= Html.Password("password", ViewData["password"]) %>
(9)TextBox 生成文本框
           使用方法:
               <%=Html.TextBox("Name", Model.Contact.Name)%>
           前台源代码:
                <input id="Name" name="Name" type="text" value="Alan" / >
(10)Button 生成一个按钮
             最新发布2.0.0.0MVC的已经没有了
(11)CheckBox  生成checkBox
          使用方法:
            <%= Html.CheckBox("a") %>
           前台源代码:
            <input id="a" name="a" type="checkbox"  />
(12)BeginForm  生成的HTML表单
         使用方法:
                    <% using (Html.BeginForm(Model.PostAction, "Home", FormMethod.Post))
                               { %>
        前台源代码:
                    <form action="/Home/Post" method="post">
(13)Image 生成图像标签
        引用一张图片
            <%=Html.Image("~/Images/bigwave.jpg") %><br />
         设置名称与宽度
            <%=Html.Image("~/Images/bigwave.jpg", "myWave", new { width = "30px" })%><br />
(14)Mailto  生成Email连接
          
            Simple Email:
                <%=Html.MailTo("mailto:weflytotti@163.com%22,%22Email Me!") %>
            With Subject and Body
                         <%=Html.MailTo("mailto:weflytotti@163.com%22,%22Email Me!","Sending you a note"
                            ,"Hey - wanted to say hi!") %>
(15)RadioButton 可选按钮
          <%=Html.RadioButton("Name","value") %>
RenderAction  呈现一个控制器行为方法
RenderPartial 由另一个视图引擎可选的呈现部分视图
RenderUserControl 呈现用户控件
RouteLink  生成特定的路由连接
SubmitButton 呈现一个类似按钮提交表单字段
SubmitImage  呈现一个类似图像提交表单字段
TextArea  呈现一个文本域
ValidationMessage 为特定的ViewData呈现一个验证信息
ValidationSummary 呈现一个ViewData的验证摘要。
Apr 1

   在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明。有时候,我们不想重复地写一些HTML代码,或者MS没有提供我们想要的那个HTML标签的Html辅助方法,那么,我们就可以通过自己定义一个Html扩展方法来达到这个目的。

  比如,到目前为止,Html扩展方法中没有关于<input type="file" />这类标签的辅助方法,那么我们就可以自已实现一个。本文以实现<input type="file" />标签为例,演示如何实现自定义Html扩展方法。

  一、实现自定义弱类型Html扩展方法

  其实实现自定义Html扩展方法并不难,有兴趣的同学可以去看下MVC源代码,关于Html扩展方法部分。要用到System.Web.Mvc命名空间下的TagBuilder类,MvcHtmlString类。TagBuilder类为Html辅助方法生成HTML标签,MvcHtmlString代表HTML编码的字符串。扩展方法代码如下所示:

代码
public static class MyInputExtensions
{
    
public static MvcHtmlString Input(this HtmlHelper htmlHelper, string name)
    {
      TagBuilder tagBuilder
= new TagBuilder("input");//设置标签类型为input
      tagBuilder.Attributes.Add("type", "file");//为标签添加type属性及值
       tagBuilder.Attributes.Add("name", name);//为标签添加name属性及值
      tagBuilder.GenerateId(name);//为标签生成Id,name参数代码Id的值
      
//创建经过HTML加密的字符串
      
//TagRenderMode.SelfClosing枚举值代表当前标签是自动关闭的
       return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.SelfClosing));
    }
  }

  需要特别提醒的是,扩展方法类所在的命名空间最好设置为System.Web.Mvc,这样,我们在View中可以通过智能感知轻易找到,也不容易出错或者无法通过VS智能感知找到我们自定义的Html辅助方法,可以为我们省去很多不必要的麻烦。将上面代码编译,我们即可在View中通过智能感知看到我们自定义的Html辅助方法。如下图所示:

Mar 29
(转)ASP.NET MVC3默认提供了11种ActionResult的实现
Mar 29
微软开发部门副总裁Scott Guthrie宣布,ASP.NET MVC及相关项目将在Apache许可证下开源,托管在CodePlex上。ASP.NET MVC是微软的Web应用程序框架,早在2009年已宣布开源,但采用的是微软公共许可证MS-PL。

在MS-PL许可证下,所有人都可以阅读源代码,但无权提出修改建议或贡献代码,对微软的决定构不成任何影响。但在新的开源开发模式下,开发者可以修正bug,修改代码,增加特性,微软将接受第三方递交的补丁。

微软已经接受了开源.NET框架Mono创始人 Miguel de Icaza递交的第一个补丁。除ASP.NET MVC外,微软还开源了ASP.NET Web API和ASP.NET Web Pages v2。

具体内容参看Scott Guthrie博客《ASP.NET MVC, Web API, Razor and Open Source》,其中最让我兴奋地ASP.NET Web API也可以在Mono平台上用了,大大提升Mono的成熟度,最近刚写了一个系列文章http://www.cnblogs.com/shanyou/category/307401.html 。期望微软和Mono团队能够更密切合作。

看看http://news.ycombinator.com/item?id=3764074 这里的讨论也很有意思。
Pages: 3/9 First page Previous page 1 2 3 4 5 6 7 8 9 Next page Final page [ View by Articles | List ]