HTML5、CSS3、ASP.NET MVC4 WebAPI大锅烩

原文 http://www.cnblogs.com/newton/archive/2013/04/26/3043615.html

今日闲来无事,把玩了下传说中的HTML5、CSS3、ASP.NET MVC4,以及随之发布的WebAPI。不得不说,新鲜的知识点太多了,不可能按部就班地去学。参照网上的几篇文章,边看边做,搭建了一个简单的demo,现将一些要点记录下来。

首先从一个介绍CSS3的国外站点down了一个登录页(HTML5+CSS3构建同页面表单间的动画切换),做了简单修改后就成了下面这个样子。 

页面中没有用到任何图片,阴影是CSS3新加的渲染标记,文本框中的图标乃是一种字体,这里还用到CSS中伪类的东东。比如用户编号和对应文本框的html:

1 <label for="username" data-icon="u">用户编号</label>
2 <input id="username" name="userCode" required="required" type="text" />

生成图标的CSS:

1 [data-icon]:after {
2     content: attr(data-icon);
3     font-family: 'FontomasCustomRegular';
4     color: rgb(106, 159, 171);
5     position: absolute;
6     left: 10px;
7     top: 35px;
8     width: 30px;
9 }

其中'FontomasCustomRegular'就是图标字体。
难点在于怎么样让登录区域垂直居中。要实现垂直居中,以前除了写JS,没有其它更好的办法。CSS3带来了flexbox的概念,能让其中的子元素灵活地排版布局。这里我们定义外围容器的样式,让它作为flexbox,登录区块就是它的子元素。

 1 #container {
 2     width: 100%;
 3     height: 100%;
 4     position: absolute;
 5     left: 0;
 6     top: 0;
 7     background: url("bg.jpg");
 8     display: -webkit-box;
 9     -webkit-box-align: center;
10     display: -moz-box;
11     -moz-box-align: center;
12     -moz-box-pack: center;
13     display: -o-box;
14     -o-box-align: center;
15     display: -ms-box;
16     -ms-box-align: center;
17     display: -ms-flexbox;
18     -ms-flex-align: center;
19 }

为了实现垂直居中,我查阅了一些资料,当时就有点怒了。本质同样的东西,不同厂商非得搞一套自己的命名规则。上述代码在IE与Chrome中工作预期,但在Firefox中则没有成功,原因未知。关于flexbox的详细讲解请看深入了解 Flexbox 伸缩盒模型,需要注意的是现行的一些概念并非所有浏览器都支持,CSS3距离统一标准还有很长的路要走。

验证通过后转到主界面,我们用localStorage.setItem("UserID", "@Model.ID");保存登录用户的ID。

 

注意顶部bar,退出链接靠右显示。在以前,我们用“float:right”就搞定了,但这里没起作用,推测由于这个bar是flexbox。后来我将退出链接设置成“margin-left:auto”,解决。左侧菜单我用WebAPI获取数据。

 1     public class AccountController : ApiController
 2     {
 3         /// <summary>
 4         /// 根据用户ID获取有权限的功能模块
 5         /// </summary>
 6         public IEnumerable<ModuleTreeItem> GetUserModules(int uid)
 7         {
 8             var modules = UserLogic.ModuleProcessOfUser(uid);
 9             return RoleVM.ChangeSysModuleToTreeItem(modules);
10         }
11     }

关于获取数据和构造树的细节和本主题无关,略之。按照WebApi(这里指的就是Asp.Net MVC4 WebApi,下同)的默认约定,现在可以用api/Account?uid=1(不能直接api/Account/1,因为参数名如果不是路由规则默认 的话,需要显式指定)请求该资源了。(读者:啥,你说资源?GetUserModules这个action哪去了?)WebApi遵照Restful风 格,在Rest中,任何对服务的请求都是针对资源的,请求类型包括增删改查。这里Account就是资源,当服务端接收到Get请求时,会查找以 “Get”开头的action并匹配参数,这里就匹配到了GetUserModules,POST\DELETE\PUT的路由方式同理。如果有多个 Get开头的不同名方法,但参数一样,客户端就会接受到下面这个信息:

这对我这类习惯了一个类里面N多方法的人来说,相当不习惯。我想既然Rest没有action这个概念,那么我将所有的action都转为controller的形式,作为资源暴露出去,不过这种方式也同样别扭。于是我增加了一个路由规则:

1 config.Routes.MapHttpRoute(
2     name: "ActionApi",
3     routeTemplate: "api/{controller}/{action}/{id}",
4     defaults: new { id = RouteParameter.Optional }
5 );

虽然违背了rest的原则,但我想凡事不能照本宣科,新的路由规则既然不会带来什么坏处,为什么不用呢?此时咱们就可以用api/Account/GetUserModules?uid=1来请求了。接着我轻快地敲出JS调用代码。

 1 var requestData = JSON.stringify({ uid: localStorage.getItem("UserID") });
 2 $.ajax({
 3     url: '/api/Account/GetUserModules',
 4     data: requestData,
 5     type: "post",
 6     dataType: "json",
 7     contentType: "application/json; charset=utf8",
 8     success: function (data) {
 9         var inline = new kendo.data.HierarchicalDataSource(
10             {
11                 data: data,
12                 schema: {
13                     model: {
14                         children: "Children"
15                     }
16                 }
17             });
18         $("#treeview").kendoTreeView({
19             dataSource: inline,
20             dataTextField: ["Module.Name"]
21         });
22
23     }
24 });

 运行时出现

405 - 用来访问本页面的 HTTP 谓词不被允许(方法不被允许)

I know,action默认只接受Get请求,so我加上[AcceptVerbsAttribute("GET","POST")],重新请求。

404的意思是找不到请求的资源,查看详细。

这种情况估计是参数没传到服务端。按照我以往的经验,应该不会有这种问题。于是我从网上down了几个大牛的demo,发现皆出现404错误,但是 看后面的评论,似乎没有童鞋提出该问题,于是哥纠结了。考虑到前段时间微软发布的vs更新包,难道是版本更新导致传参方式变动?正打算去找一下官方的更新 文档,一个特性FromBody映入眼帘(asp.net webapi下json传值方式)。我抱着试试看的心情,尝试了下。

看到这里,是不是有种想撞墙的赶脚?400,错误请求。查看详细信息:{"Message":"请求无效。","MessageDetail":" 对于“WebHabilimentERP.API.AccountController”中方法 “System.Collections.Generic.IEnumerable`1[SysProcessViewModel.ModuleTreeItem] GetUserModules(Int32)”的不可以为 null 的类型“System.Int32”的参数“uid”,参数字典包含一个 null 项。可选参数必须为引用类型、可以为 null 的类型或声明为可选参数。"}。

经过一番google、bing,甚至百度都上场了,终于找到一篇稍微有用的文章:ASP.NET WebAPI throw 404 if method parameter is string or int。按照文中方法尝试,无果。不过它倒提醒我,是不是不用传参数名,既将data: { uid: localStorage.getItem("UserID") }改为data: localStorage.getItem("UserID"),成功。

最终代码如下:

服务端

1 [AcceptVerbsAttribute("GET","POST")]
2 public IEnumerable<ModuleTreeItem> GetUserModules([FromBody] int uid)
3 {
4     var modules = UserLogic.ModuleProcessOfUser(uid);
5     return RoleVM.ChangeSysModuleToTreeItem(modules);
6 }

客户端

 1 $.ajax({
 2     url: '/api/Account/GetUserModules',
 3     data: localStorage.getItem("UserID"),
 4     type: "post",
 5     dataType: "json",
 6     contentType: "application/json; charset=utf8",
 7     success: function (data) {
 8         var inline = new kendo.data.HierarchicalDataSource(
 9             {
10                 data: data,
11                 schema: {
12                     model: {
13                         children: "Children"
14                     }
15                 }
16             });
17         $("#treeview").kendoTreeView({
18             dataSource: inline,
19             dataTextField: ["Module.Name"]
20         });
21
22     }
23 });

敲门(非入门)完毕。

转载请注明出处:http://www.cnblogs.com/newton/archive/2013/04/25/3043615.html

时间: 2024-08-01 14:07:51

HTML5、CSS3、ASP.NET MVC4 WebAPI大锅烩的相关文章

06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布

Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 我们先看看画布的魅力:     初始画布 canvas默认是宽300px,高150px; 绘制步骤 1.定义一个id <canvas id="canvasOne" width="300" height="300"></canvas> 2.获取canvas对象 var canvasO

07. Web大前端时代之:HTML5+CSS3入门系列~H5 地理位置

Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 定位类型 IP 定位 优点 任何位置都可用 在服务器端处理 缺点 不精确,一般精确到城市 运算代价大,可能出错 代理的时候就可能定位出错了 GPS定位 优点 定位精准 缺点 定位时间长,耗电量大 室内效果不好 需要硬件设备支持 Wi-Fi定位 优点 定位精准 简单快捷定位 可以在室内使用 缺点 适合大城市,WIFI接入点少的地方效果差 手机定位 优点 定

用HTML5/CSS3/JS开发Android/IOS应用

现在人人都想成为安卓/IOS应用开发工程师.其实,安卓/IOS应用可以用很多种语言来实现.由于我们前端开发工程师,对HTML5/CSS/JavaScript的网络编程已经相当熟悉了.所以,今天大家将会认识到一些利用前端语言来开发安卓/IOS应用的工具.  在文章的末尾,也介绍了使用JAVA.C#.Lua以及AS3来开发安卓应用的工具.  希望大家都能找到适合自己的开发工具!祝大家开发安卓/IOS应用一切顺利!    PhoneGap  开发语言: HTML, CSS, JavaScript 开发

献给网页设计师的HTML5/CSS3/JS便捷工具

  是时候为网页设计师的来一组便捷的辅助工具了.日新月异的网页技术革新催生了大量的设计与开发工具,HTML5/CSS3几乎成了设网页设计师的必修课,而强大的JS也为网页提供了更多的可能性.尤其是HTML5,作为一门极为有用且实用的标记语言,它赋予网页设计师创造更优秀网页的可能. 这也是为什么,身为网页设计师的你需要不停地了解最新的技术趋势和新兴工具,这些全新的库.框架.插件和技术能让你的网页如虎添翼. HTML5使得设计师和开发者在各个不同领域都比之前更强大了.快速,漂亮,安全,响应式,这些特性

20个九月最新的HTML5/CSS3优秀网站

  今天来一组酷炫的HTML5 – CSS3 优秀网站,无论是网站主题(反战.捍卫人权.肯德基老爷爷的美好晚年等)还是动效视觉,都非常值得体验.周末休息下,来点轻松的吧 The Generations Relay 2014年是华沙起义70周年,华沙博物馆邀请了在那场战斗有代表性的12个组织参加这个"薪火相传"的活动,组织里的年轻人庄严宣誓,他们将承担起建造一个自由.爱.诚实.谦虚.友善.保护弱者.有责任感的世界这个任务. Nike – Geç Kendini 耐克2015年夏季的女装的

提高开发速度的HTML5/CSS3框架

Perkins是个HTML5/CSS3框架,能让设计师提高开发速度. 整个框架带有一个简单的模板,其中包含了大多数的HTML的标签样式,以及一些网页上常见的,如导航条.圆角等等.模板中元素的样式也设计得相当好看,此外还带有一套图标. 兼容性: 所有主流浏览器 网站: http://p.erkins.com/ 官方下载: http://code.google.com/p/perkins-less/downloads/list

HTML5/CSS3的开发框架:实用HTML5和CSS3框架

文章简介:所有的开发人员都应该注意了,你们绝对应该看看这篇文章,帮助你快速创建HTML5/CSS3的开发框架.可能你也看到过其它的框架,但是你应该看看这些框架,因为你以前可能没用过他们中的大部分.看看最新的实用HTML5和CSS3框架吧! 所有的开发人员都应该注意了,你们绝对应该看看这篇文章,帮助你快速创建HTML5/CSS3的开发框架.可能你也看到过其它的框架,但是你应该看看这些框架,因为你以前可能没用过他们中的大部分.看看最新的实用HTML5和CSS3框架吧!希望你们喜欢! 1.HTML5b

HTML5 CSS3简明教程

Web 设计师可以使用HTML4和CSS2.1完成一些很酷的东西.我们可以在不使用陈旧的基于table布局的基础上完成文档逻辑结构并创建内容丰富的网站.我们可以在不使用内联<font>和<br>标签的基础上对网站添加漂亮而细腻的风格样式.事实上,我们目前的设计能力已经让我们远离了那个可怕的浏览器战争时代.专有协议和那些充满闪动.滚动和闪烁的丑陋网页. 虽然我们现在已经普遍使用了HTML4和CSS2.1,但是我们还可以做得更好!我们可以重组我们代码的结构并能让我们的页面代码更富有语义

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(1)前言

前言 曾几何时我想写一个系列的文章,但是由于工作很忙,一直没有时间更新博客.博客园园龄都1年了,却一直都是空空的,网上后台管理系统,权限管理系统多如猴毛,各个大虾都有自己的想法和方式.当然我还未能是大虾, 前言 做一件事情之前总会有前言,首先本项目的原型是我之前在一家公司研发的一个制造业ERP系统,已经上线并开始运行,按道理来说这是一套合格的系统方案.之前原型是 Asp.net MVC3.0+EF4.1+Unity2.x+easyui+jqgrid 原型效果图,由于是公司项目无法带出,这个升级版