摘要:
ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节。 ①以IIS6.0为例,首先由w3wp.exe维护着一个工作进程 ②如果是第一次加载,由Aspnet_isapi.dll加... 阅读全文
摘要:
本篇的标题虽然是"jQuery闭包之浅见...",但实际上本篇涉及的多半是javascript"闭包"相关内容,之所以写这个标题,完全是因为自己平常用jQuery写前端习惯了。还有一个原因是:javascript"闭包"很容易造成"内存泄漏", 而jQuery已经自动为我们规避、处理了由"闭包"引发... 阅读全文
摘要:
当一个类依赖于另一个具体类的时候,这样很容易形成两者间的"强耦合"关系。我们通常根据具体类抽象出一个接口,然后让类来依赖这个接口,这样就形成了"松耦合"关系,有利于应用程序的扩展。我们可以用DI容器、Dependency Injection容器,即依赖注入容器来管理接口和实现类。所谓的"依赖注入"是... 阅读全文
摘要:
引子 在了解MVC路由之前,必须了解的概念是"片段"。片段是指除主机名和查询字符串以外的、以"/"分隔的各个部分。比如,在http://site.com/Home/Index中,包含2个片段,第一个片段是Home,第二个片段是Index。 URL匹配的特点:● 保守的:URL中的片段数量必须和路由规则中的片段数量一致(路由规则没有设置默认值的前提下)● 宽松的:在满足片段数要求的前提下,UR... 阅读全文
摘要:
假设控制器方法参数类型是int: public ActionResult GetSth(int id) { return Content(id.ToString()); }而视图传递过来的是字符串:@Html.ActionLink("获取","GetSth",new {id="hello"})于是就会报类似如下的错: 对于“MvcApplicati... 阅读全文
摘要:
如何让视图通过某种途径,把符合日期格式的字符串放到路由中,再传递给类型为DateTime的控制器方法参数?即string→DateTime。MVC默认的ModelBinder并没有提供这样的机制,所以我们要自定义一个ModelBinder。 首先,在前台视图中,把符合日期格式的字符串赋值给date变量放在路由中: @Html.ActionLink("传入日期格式为2014-06-19","Dat... 阅读全文
摘要:
针对某个类型,如果我们不想或不能改变其内部,但想为该类型添加方法,我们可以使用扩展方法来实现。如果该类型有更高层次的抽象,比如接口,我们应为更高层次类型编写扩展方法。另外,扩展方法是链式编程的前提。 判断集合是否包含元素 List list = new List();if(list != null && list.Count > 0){ }我们可以针对比int类型更高层次的ICollec... 阅读全文
摘要:
比如,当为一个用户设置角色的时候,角色通常以CheckBoxList的形式呈现。用户和角色是多对多关系: using System.Collections.Generic;using System.ComponentModel.DataAnnotations;namespace MvcApplication2.Models{ public class User { pub... 阅读全文
摘要:
如果创建如下的XML: darren 创建XML文件在HomeController中,在根目录下创建new.xml文件:public ActionResult Index() { return View(); } [HttpPost] public ActionResult AddXml() ... 阅读全文
摘要:
使用MvcSiteMapProvider可轻松实现站点地图,俗称"面包屑"。如图: 通过NuGet,输入MvcSiteMapProvider搜索,并安装。 在Mvc.sitemap中配置如下: 创建HomeController, Index方法以及对应的视图。创建NewsController,Index方法和Sports方法,以及对应的视图。创建Ab... 阅读全文
摘要:
有关Model: namespace MvcApplication1.Models{ public class Coach { public int Id { get; set; } public string Name { get; set; } }}HomeController中,借助GridView控件把内容导出到Excel:using Sys... 阅读全文
摘要:
借助Masonry可轻松实现瀑布流。本篇实现一个简单的图文瀑布流效果,如下: 图文瀑布流显示的2个要素是图片路径和文字内容,对应的Model为: namespace MvcApplication1.Models{ public class News { public string ImgUrl { get; set; } public string Con... 阅读全文
摘要:
有这样的一个Model: namespace MvcApplication1.Models{ public class Team { public string Preletter { get; set; } public string Name { get; set; } }} 通过jQuery异步加载部分视图Home/Index.cshtml视图中... 阅读全文
摘要:
部门和职员是1对多关系。用一个表格列出所有部门,并且在每行显示该部门下的所有职员名称。如下: 部门和职员的Model: using System.Collections.Generic;namespace MvcApplication1.Models{ public class Department { public int Id { get; set; } ... 阅读全文
摘要:
有这样的一个Model: using System.ComponentModel.DataAnnotations;namespace MvcApplication1.Models{ public class Movie { public int Id { get; set; } [Required(ErrorMessage = "必填")] ... 阅读全文
摘要:
当需要为Model的属性添加一些额外信息的时候,使用[AdditionalMetadata("somekey", "some content")]是不错的选择,MVC内部把键值信息赋值给了ModelMetadata.AdditionalValues属性。那么,在视图中如何获取该属性的ModelMetadata呢? ModelMetadata提供的静态方法FromLambdaExpression(... 阅读全文
摘要:
假设有这样的一个类,包含DateTime类型属性,在编辑的时候,如何使JoinTime显示成我们期望的格式呢? using System;using System.ComponentModel.DataAnnotations;namespace MvcApplication1.Models{ public class Employee { public DateTime?... 阅读全文
摘要:
文本编辑器有很多,比如ticymce和CKEditor就比较好用,但涉及到图片、文件上传,需要结合CKFinder实现,而且有些功能是收费的,即使有意付费使用, 支付也不方便。好在百度的开源文本编辑器UEditor现在也发展得不错,本篇就来体验其在MVC中的使用。需要实现如下效果:1、上传图片2、上... 阅读全文
摘要:
使用StructureMap也可以实现在MVC中的依赖注入,为此,我们不仅要使用StructureMap注册各种接口及其实现,还需要自定义控制器工厂,借助StructureMap来生成controller实例。 有这样的一个接口: namespace MvcApplication1{ public interface IStrategy { string GetStra... 阅读全文
摘要:
□ 实现Accordion高度一致 Index 世界杯第一天 在揭幕战中,巴西队将在圣保罗迎战克罗地亚队。 世界杯第二天 今天的焦点之战是上届世界冠军巴西队将在萨尔瓦多对战"无冕之王"荷兰队。此外,... 阅读全文
摘要:
□ 思路 点击一个链接,把该文件的Id传递给控制器方法,遍历文件夹所有文件,根据ID找到对应文件,并返回FileResult类型。 与文件相关的Model: namespace MvcApplication1.Models{ public class FileForDownload { public int Id { get; set; } public ... 阅读全文
摘要:
通常情况下,使用TempData需要记住key的名称,本篇体验:通过帮助类,实现对TempData的设置、获取、删除。 关于传递信息的类: namespace MvcApplication1.Models{ public class Notification { public bool IsShow { get; set; } public string ... 阅读全文
摘要:
JCrop用来裁剪图片,本篇想体验的是: 在视图页上传图片: 上传成功,跳转到另外一个编辑视图页,使用JCrop对该图片裁剪,并保存图片到指定文件夹: 裁剪成功后,在主视图页显示裁剪图片: 当然,实际项目中最有可能的做法是:在本页上传、裁剪并保存。 □ 思路 →在上传图片视图页,把图片上传保存到一个临时文件夹Upload→在编辑裁剪视图页,点击"裁剪"按钮,把JCrop能提供的参数,比如... 阅读全文
摘要:
借助Chosen Plugin可以实现多选下拉框。 选择多项: 设置选项数量,比如设置最多允许2个选项: 考虑到多选下拉选中项是string数组,Model应该这样设计: using System.Collections.Generic;using System.Web.Mvc;namespace MvcApplication1.Models{ public class CarV... 阅读全文
摘要:
Facade模式对外提供了统一的接口,而隐藏了内部细节。在网上购物的场景中,当点击提交订单按钮,与此订单相关的库存、订单确认、折扣、确认支付、完成支付、物流配送等都要做相应的动作。本篇尝试使用Facade模式,把这些类似工作者单元的动作隐藏到一类中,只要点击提交订单,余下的事情一步到位: □ 关于库存 namespace ConsoleApplication1.Interfaces{ pu... 阅读全文
摘要:
本篇实现的效果为:当学校有通知的时候,把通知内容发送到每一个人,如下: □ 思路可以把通知内容、通知对象、通知方式、通知行为抽象成类、接口、接口实现,再为一些接口创建对应的抽象工厂及其实现。所有的这些依赖可以通过"依赖倒置容器"来管理。 →关于通知内容,可以封装成一个类→关于通知对象,可以抽象出基类和实现类→关于通知对象的Repository,有对应的接口、接口实现,抽象工厂、抽象工厂实现→关于... 阅读全文
摘要:
本文体验在MVC中使用ASP.NET Identity 2.0,体验与用户身份安全有关的功能: →install-package Microsoft.AspNet.Identity.Samples -Version 2.0.0-beta2 -Pre 安装后,在App_Start,Controllers, Models, Views等处都添加了多个文件。在App_Start/IdentityCon... 阅读全文
摘要:
把视图省、市、街道表单数据,封装成一个类,作为action参数。如下: action方法参数类型: namespace MvcApplication1.Models{ public class Customer { public string Address { get; set; } }} 在自定义ModelBinder中,接收视图表单数据,封装成Customer类。 using Syste... 阅读全文
摘要:
□ ValueProvider的大致工作原理 →通过Request.Form, Request.QueryString, Request.Files, RouteData.Values获取数据。→然后把数据提供给Model Binder。 public interface IValueProvider{ bool ContainsPrefix(string prefix); Value... 阅读全文
摘要:
比如,有这样一个类: public class User { public string Name { get; set; } } 当在强类型视图页,显示属性Name对应的input元素,并想添加一个title属性和对应的值,如图: □ 思路 →自定义TooltipAttribute,可以打到Name属性上。→自定义DataAnnotationsModelMetadataProvider,... 阅读全文
摘要:
在Product类中有一个显示删除状态的属性DelFlag,在编辑视图页,对于所有的删除状态以RadioButtonList显示出来,如果RadioButtonList选项的value值与当前model的DelFlag属性值相同,则勾选该选项,如图: 思路: →在Views/Shared/EditorTemplates/RadioButtonList.chtml部分视图以RadioButton... 阅读全文
摘要:
实现的效果为:在编辑视图中,对DateTime类型的属性,显示jQuery UI的datepicker。效果如下: Student.cs public class Student { public int Id { get; set; } public string Name { get; set; } public DateTime? JoinTime { get; set; } } Ho... 阅读全文
摘要:
与ActionFilter相关的接口有2个: □ IActionFilter 对action执行前后处理 void OnActionExecuting(ActionExecutingContext filterContext);可以在此对请求处理,甚至开启一个新的请求。 void OnActionExecuted(ActonExecutedContext filterContext);可以在此... 阅读全文
摘要:
□ 接口 public interface IExceptionFilter{ void OnException(ExceptionContext filterContext);} ExceptionContext继承于ControllerContext,从中可以获得路由数据route data、HttpContext。 □ 的HandleErrorAttribute是对IExceptionFi... 阅读全文
摘要:
为什么需要AuthorizationAttribute 在没有Authorization系统属性之前,我们可能这样判断:Request.IsAuthenticated && User.Identity.IsAuthenticated来判断请求是否有权限。 有了Authorization系统属性之后,我们可能这样:[Authorize]public ActionResult SomeAction... 阅读全文
摘要:
希望实现的效果是:对购物车中所有商品的总价,实现9折或8折:当点击"9折":当点击"8折":□ 思路8折或9折是打折接口的不同实现,关键是:由什么条件决定使用哪种打折方式?--当点击8折或9折链接的时候,把参数放在路由中,然后在自定义控制器工厂中根据参数的不同选择使用哪种打折方式。□ model p... 阅读全文
摘要:
关于控制器工厂的扩展,要么通过实现IControllerFactory接口,要么通过继承DefaultControllerFactory。本篇中,我想体验的是:1、当请求经过路由,controller, action名称是以key/value键值对形式存放的,我们可以通过RequestContext... 阅读全文
摘要:
ActionInvoker的作用是:根据请求数据(HttpPost,HttpGet等)和action名称,来激发响应的action,再由action渲染视图。本文通过自定义ActionInvoker,根据请求类型直接渲染视图。控制器中有这样的一个Action: public ActionResult... 阅读全文
摘要:
当我们使用jQuery异步提交表单数据的时候,需要把部分视图转换成字符串(带验证信息),以json的形式传递给前端视图。 使用jQuery异步加载部分视图,返回内容追加到页面某个div: jQuery异步提交失败,返回带验证失败信息的部分视图字符串,并追加到页面div: jQuery异步提交成功,返回显示提交成功的部分视图字符串,并追加到页面div: 一... 阅读全文
摘要:
使用Mustache的好处是:可以把一些反复用到的html部分定义成Mustache模版,以便多次使用。使用Mustache的大致步骤是: →从后台拿到json数据 →获取前台页面预先定义好Mustache模版(占位符必须和从后台传来的的字段或属性名一致) →遍历每行的json数据,使用Mustache.render(template, row)方法把json数据填充到对应的占... 阅读全文