ASP.NET 5探险(7):使用混合型控制器方便实现单页应用
(此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注。)
题记:由于在ASP.NET 5中,MVC和WEB API的技术栈合并了,所以开发混合型Controller也成为可能。
众所周知,在ASP.NET MVC 5和WEB API 2时代,两者的技术栈是独立的(开发团队也是独立的)。虽然后来两者都可以融合到OWIN中运行在一起,但是两者的控制器(Controller)代码是不能写在一起的(因为两者的基类不一致)。诚然,MVC控制器也可以通过返回Json数据来实现类似WEB API控制器的效果,但是所体现的设计效果并不是纯粹的REST API。
可能微软也意识到并行提供两套技术栈,不仅给自己的开发带来维护难度,也给用户的学习和开发带来困难。所以,在ASP.NET 5中,两者在技术栈上进行了统一,也就是在MVC中可以开发WEB API。这样的技术融合最大的体现的就是路由映射的机制。关于ASP.NET 5中的路由机制,我就不赘述了,大家可以参考其他资料,比如《解读ASP.NET 5 & MVC6系列(11):Routing路由》(http://www.cnblogs.com/TomXu/p/4496462.html)。
为了做一个SPA的示例,我尝试使用了混合型控制器来同时支持视图的处理和REST数据接口的处理,这样带来的好处是不需要为了MVC和REST API分别创建两个控制器,且能同时符合MVC和REST API的Action和路由风格。可能用文字很难描述出混合型控制器的特点,还是直接来看代码吧。
public class UserController : Controller
{
private AccountManager _accountManager; public UserController(AccountManager accountManager)
{
_accountManager = accountManager;
} //下面是mvc的action // GET: /<controller>/
public IActionResult Index()
{
return View();
} public IActionResult Edit(string id)
{
ViewBag.Id = id;
return View();
} //下面是api的action [HttpGet("[controller]/api")]
public async Task<BasePagingListDto<UserDto>> GetAll(int page = 1, int pageSize = 10)
{
var query = _accountManager.UserManager.Users;
var total = await query.CountAsync();
var users = await query.Skip((page - 1) * pageSize).Take(pageSize).ToListAsync();
var dto = new BasePagingListDto<UserDto>();
dto.Items = users.ConvertAll(user => Mapper.Map<UserDto>(user));
dto.Total = total;
return dto;
} [HttpGet("[controller]/api/{id}")]
public async Task<IActionResult> GetById(string id)
{
var user = await _accountManager.UserManager.FindByIdAsync(id);
if (user == null) return HttpNotFound();
var dto = Mapper.Map<UserDto>(user);
return new ObjectResult(dto);
} [HttpPut("[controller]/api/{id}")]
public async Task<IActionResult> EditById(string id, UserDto dto)
{
if (ModelState.IsValid)
{
var user = await _accountManager.UserManager.FindByIdAsync(id);
if (user == null) return HttpNotFound();
dto.SetValue(user);
await _accountManager.UserManager.UpdateAsync(user);
return new HttpStatusCodeResult((int)HttpStatusCode.Accepted);
}
return new HttpStatusCodeResult((int)HttpStatusCode.BadRequest);
}
}
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
在上面的代码中,Index这个Action会返回一个视图(Index.cshtml)给用户。在这个cshtml文件中,主要是利用Layout.cshtml来获得统一的母版,只包含很少的Razor代码,而使用jQuery和Knockout来加载和动态展示数据。其中加载数据是通过GetAll这个Action,获取地址还是利用"@Url.Action("GetAll")"来得到,而实际访问是GET“/User/api”。
同样,Edit这个Action会返回一个视图(Edit.cshtml)用于编辑用户的信息。加载用户的单条数据是通过GetById这个Action,实际访问是GET“/User/api/[userid]”。当需要修改数据的时候,是使用EditById这个Action,实际访问地址是PUT “/User/api/[userid]”。
这个控制器的代码也可以通过代码片段来查看:http://git.oschina.net/ike/codes/8avtl3u2p6g1ik09c5snz
ASP.NET 5探险(7):使用混合型控制器方便实现单页应用的更多相关文章
- ASP.NET MVC 5 - 将数据从控制器传递给视图
在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图.控制器类将响应请求来的URL.控制器类是给您写代码来处理传入请求的地方,并从数据库中检索数据,并最终决定什么类型的返回结果 ...
- ASP.NET 5探险(3):使用UMEditor并实现图片上传
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:今天将继续上一篇来讲解百度富文本Web编辑器UEditor或UMEditor的使用. ...
- ASP.NET MVC 5 学习教程:控制器传递数据给视图
原文 ASP.NET MVC 5 学习教程:控制器传递数据给视图 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字 ...
- 006.Adding a controller to a ASP.NET Core MVC app with Visual Studio -- 【在asp.net core mvc 中添加一个控制器】
Adding a controller to a ASP.NET Core MVC app with Visual Studio 在asp.net core mvc 中添加一个控制器 2017-2-2 ...
- [转]ASP.NET MVC 5 - 将数据从控制器传递给视图
在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图.控制器类将响应请求来的URL.控制器类是给您写代码来处理传入请求的地方,并从数据库中检索数据,并最终决定什么类型的返回结果 ...
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...
- asp.net MVC中form提交和控制器接受form提交过来的数据
1.cshtml页面form提交2.控制器处理表单提交数据4种方式方法1:使用传统的Request请求取值[HttpPost]public ActionResult AddNews(){ str ...
- 七天学会ASP.NET MVC(七)——创建单页应用
系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)— ...
- [译]用AngularJS构建大型ASP.NET单页应用(二)
原文地址:http://www.codeproject.com/Articles/808213/Developing-a-Large-Scale-Application-with-a-Single 客 ...
随机推荐
- logging模块使用示例
日志等级说明: UNSET < DEBUG < INFO < WARNNING < ERROR < CRITICAL import logging logger = l ...
- 开始学习C++
这里突然想起来当初学习java和C# 总是会有个demo : hello world. 这里我记得我曾经看过一个笑话.说有个程序员,想学习书法,买了笔墨,都准备好了,但是不知道写什么好.最后,他大 ...
- (转)C++0x语言新特性一览
转自:http://blog.csdn.net/zwvista/article/details/2429781 原文请见http://en.wikipedia.org/wiki/C%2B%2B0x. ...
- (转)Xcode调试技巧
转自http://www.apkbus.com/android-140340-1-1.html 这篇文章给大家带来的是一些Xcode实用技巧,比如: • 摆脱NSlog打印输出,使用断点日志. • 摆 ...
- 错误日志中关于innodb的问题收集
1.错误日志报告如下: ..... 120223 23:36:06 InnoDB: Compressed tables use zlib 1.2.3 120223 23:36:06 InnoDB: I ...
- Effective C++ -----条款19:设计class犹如设计type
Class的设计就是type的设计.在定义一个新type之前,请确定你已经考虑过本条款覆盖的所有讨论主题. 新type的对象应该如何被创建和销毁? 对象的初始化和对象的赋值该有什么样的区别? 新typ ...
- 51nod 1099 任务执行顺序 (贪心算法)
题目:传送门. 题意:中文题. 题解:r[i]-o[i]值大的先进行.反证法:如果大的后进行,会导致空间增大,所以一定大的是先进行. #include <iostream> #includ ...
- ssh自动登陆
突然碰到有人问ssh再传输密钥时候能不手动输入密码,由于没有碰到过这种情况,所以查了一下发现可以用sshpass做到. sshpass [参数] ssh命令: 参数: -p password #将参 ...
- C#实现把指定文件夹下的所有文件复制到指定路径下以及修改指定文件的后缀名
1.实现把指定文件夹下的所有文件复制到指定路径下 public static void copyFiles(string path) { DirectoryInfo dir = new Directo ...
- 解决jetty7.0.pre5启动时报ClassNotFoundException: javax.interceptor.InvocationContext异常的问题
一.背景介绍:最近项目在使用maven命令行运行jetty服务器时出现ClassNotFoundException: javax.interceptor.InvocationContext异常 二.环 ...