Edi Wang

Azure Developer, Microsoft MVP

ASP.NET


ASP.NET MVC ActionFilterAttribute的执行顺序

ASP.NET MVC里面我们要自定义ActionFilter的时候会发现有4个方法可以override:OnActionExecuting,OnActionExecuted,OnResultExecuting,OnResultExecuted。他们分别在什么时候执行一直是困扰人类的一个问题。我代表人类做了一个简单的实验: 首先自定义一个ActionFilter,每个方法执行的时候都在VS的OUTPUT窗口输出信息: public class TestActionFilter : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { Debug.WriteLine("OnActionExecuting"); …

ASP.NET MVC

ASP.NET Web API 跨域访问(CORS)要注意的地方

前几天我在帮队友撸一个WebAPI的跨域访问问题,被爆出了翔,今天正好有时间总结一下经验。 首先一个最坑之坑,也是ASP.NET官网上都没有提到的坑,是Web.config里的配置。大家看这个建立WebAPI项目之后,默认的Web.config: 它居然把OPTIONS类型的请求给撸掉了!然而,在jQuery等框架里发起CORS请求的时候,虽然你写的可能是“GET”,但是现在的浏览器是会自动把这个GET先撸成OPTIONS去访问服务的,这也叫“preflight”请求。如果你的服务拒绝OPTIONS这个verb,你会得到一个405的结果(用fiddler就可以看到)。 所以,要让WebAPI支持CORS,第一步就是在web.config里把“”删掉。 接下来,要实现CORS,有两种办法。一是在客户端完成(要求对WebAPI做少量拓展),二是在服务端(WebAPI)本身做支持。 一、客户端 …

ASP.NET Web API CORS

Kendo UI for ASP.NET MVC 的一些使用经验

最近的项目里用到了Kendo UI。这货很好很强大,但可惜官方文档组织的并不是很好,有很多配置非常坑,需要自己去发掘。 一、版本 首先,是版本的区别。简单的来说,免费版的Kendo UI是不包含DataViz组件的,即没有图表功能,并且也没有服务端的Helper,比如MVC的wapper,所以,免费版只有js和css,不会给你dll的。 收费版,比如for MVC的这个版本,除了包含dataviz以外,还包含预先定义好的mvc wapper,所以你需要引用dll才能使用kendo的html helper。这些Helper的功能仅仅是生成对应的JS,对于熟悉C#的程序员来说,图个方便而已。不过不得不承认,这些helper的设计是一流的,使用lambda表达式来配置参数感觉非常棒。 总结一下,如果你的团队前端程序员非常碉,你可以使用免费版,但不包含图表组件。如果你是像我一样的屌丝ASP. …

ASP.NET MVC Kendo UI

ASP.NET WebAPI 自动生成帮助文档

目前在做的项目里要用到RESTful Service,一开始是用WCF WebHttpBinding撸的,但我知道WebAPI才是最适合的,正好现在VS2013 RTM了,Web API 2也跟着ASP.NET MVC5一起发布了,于是今天就把Service用Web API 2重写了一下。 我选择Web API的一个重要原因就是因为可以自动生成文档,省去了开发人猿不少宝贵的时间。以前在用Web API第一代的时候,自动生成帮助文档的功能默认是不完整的,现在到了Web API 2,这个功能已经通过NuGet包的形式很好的整合到了一起。我们来看一下吧! 首先,用VS2013创建的Web API 2项目会默认带有Microsoft ASP.NET Web API Help Page的包。如果没有,就需要手动去NuGet上安装。 在安装了这个包以后,你的Web API项目目录里会多一个 …

ASP.NET Web API

ASP.NET Web API接受JSON格式复杂对象(嵌套)

上礼拜在公司开荒Web API,被爆出翔了。遇到个具体问题是这样的:Web API中的方法接受的参数是个复杂对象,这个对象里嵌套了另一个对象。但使用API的人不知道如何在JSON里传递复杂对象给Web API。大家一起爆了很久,尝试了各种写法,还是没能解决。 今天我突然想到一个办法,可以获取正确的Nested JSON字符串。并且开荒成功了。与大家分享: 首先,我写的例子是这样的,Product对象里嵌套了一个Category对象,AddProduct的方法接受的是Product对象,我不仅需要Product的信息,也需要被嵌套的Category的信息: [HttpPost] public string AddProduct(Product productModel) { var sb = new StringBuilder(); sb.Append("Product. …

ASP.NET jQuery Json Web API

How to Manually Upgrade ASP.NET MVC3 Projects to MVC4

前几天公司的阿三给我了一项艰巨的任务:码一个MVC4网站。本猿之前只用过MVC3,稍微看了下MVC4,有些地方都变了,如果用默认模板全新做一个MVC4网站得很小心,比如javascript的位置很容易爆出翔来。但好消息是,之前码MVC3的所有知识,都可以用在MVC4上,无需任何代码修改。 作为一个有梦想有目标的屌丝,我如果自己都没认真用过MVC4,以后在公司装逼就没底气了。所以,今天我正好休息在家,查了写资料,成功的把博客从MVC3升级到了MVC4。现在你看到的这个博客,就是稳定运行在MVC4上的。 首先,运行MVC4并不需要IIS8或.NET4.5。它完全能够部署在IIS7、IIS7.5上。所以我不用升级Target Framework的版本。只需要更新MVC4的相关DLL,以及一些config文件就可以完成升级。 按照 http://www.asp.net/whitepapers/ …

ASP.NET NuGet

给ASP.NET Membership增加权限(Rights)功能

首先说明,本文用的是非常屌丝的办法,针对SQL Server Membership的实现的一个很有局限性的权限模块,而不是真正对ASP.NET Membership本身的拓展。不喜慎入。 一、为什么要给Memebership增加权限系统 我们知道,ASP.NET Membership是基于Role的,其实是个RBAC,没有权限(Rights)功能。也就是说,我们只能够指定某个Role可以做什么事,丧失了一定的灵活性。比如,网站后台有个编辑文章的功能。如果基于Role判断,我只能认为:所有Admin、Editor、Teacher可以编辑文章。在MVC3里,可以用Authorize(Role=”Admin, Editor, Teacher”)的属性做到这一点。然而如果想要动态可配,则比较难了。然而,如果是基于Rights的验证,那我就可以认为:所有具有Edit权限的Role可以编辑文章。这样的 …

ASP.NET Membership RBAC

ASP.NET MVC3 TextBox拓展:兼容主流浏览器的PlaceHolder

在MVC的view页面上,我们虽然可以通过给html attribute手写new { @placeholder = "something" }来增加placeholder属性,但这样做对于MVC3框架而言不是非常地道。一个比较好的办法是通过拓展MVC,来增加一个DataAnnotation属性,最终在Model中指定PlaceHolder。下面的方法是我在stackoverflow网站上撸到的,稍作修改并测试后发现非常牛逼,分享给大家。首先,我们要码一个PlaceHolderAttribute类,让它继承Attribute, IMetadataAware两个接口。注意类名是包含Attribute后缀的,但最终使用的时候是只取PlaceHolder这个名字的。(这个机制是.NET自己撸的,我们不用管) public class PlaceHolderAttribute : …

ASP.NET MVC

Store and Read Images via SQL Server in ASP.NET MVC 3

First of all, I don't recommend storing images in the database, especially in a web project. Because file systems can provide static file access and get many benefits such as performance. Storing images in the database has certain limits. But if you must store images into SQL Server, here's how to do it.  SQL Image files are in fact, binary data. SQL Server provides us the image type for …

ASP.NET MVC SQL Server

如何在1分钟内完成一个MVC3 Ajax Grid(增删改查)

以前用ASP.NET WebForms的时候,要让一个Gridview支持AJAX,只要扔到一个Update Pannel里就行了,简单粗暴。然而,在MVC里,关于HTML细节的一切都要我们自己写了,没了Update Pannel这样的无脑控件,怎么快速完成一个AJAX Grid呢? 其实微软已经悄悄的在NuGet上放了一个名为“AjaxGridScaffolder”的包,只要用NuGet下载安装,就可以在你的项目里添加AJAX Grid了。它和别的MVC Scaffolder一样,是一种模板,可以根据你的数据库访问类(要求Entity Framework)以及实体类生成支持CRUD的Grid。效果如下: 具体构建方法如下: 1. 确保你的MVC3项目里添加了EntityFramework,并且根据你需要的数据库生成了edmx。 2. 你的网页上引用了JQuery(如果不引用,最后生成的 …

AJAX ASP.NET CRUD Grid