Asp.net mvc 知多少(五)
本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想看英文原版的可访问http://www.dotnettricks.com/free-ebooks自行下载。该书主要分为两部分,ASP.NET MVC 5、ASP.NET WEB API2。本书最大的特点是以面试问答的形式进行展开。通读此书,会帮助你对ASP.NET MVC有更深层次的理解。
由于个人技术水平和英文水平也是有限的,因此错误在所难免,希望大家多多留言指正。
系列导航
Asp.net mvc 知多少(一)
Asp.net mvc 知多少(二)
Asp.net mvc 知多少(三)
Asp.net mvc 知多少(四)
Asp.net mvc 知多少(五)
本节主要讲解几种页面传值方式和http请求与action的映射
Q50. 介绍下ViewData, ViewBag, TempData 和 Session间的不同之处?
Ans. 在ASP.NET MVC 中有三种方式从controller传值到view中:ViewData, ViewBag 和 TempData。Asp.net WebForm 中可以在一次用户会话中使用Session去持久化数据。
ViewData
- ViewData 是一个继承自
ViewDataDictionary
类的字典对象。
public ViewDataDictionary ViewData { get; set; }
- ViewData 用来从controller中传值到相对应的view中。
- 生命周期仅存在于当前此次请求。
- 如果发生重定向,那么值将会被清空。
- 从ViewData中取值时需要进行类型转换和Null Check以避免异常。
ViewBag
- ViewBag ViewBag是一个动态属性,是基于C# 4.0的动态语言的特性。
public Object ViewBag { get;}
- 是对ViewData的一次包装,也是用来从controller中传值到相对应的view中。
- 生命周期仅存在于当前此次请求。
- 如果发生重定向,那么值将会被清空。
- 从ViewBag中取值时不需要进行类型转换。
TempData
- TempData 是一个继承于
TempDataDictionary
类的字典对象,存储于Session中 。
public TempDataDictionary TempData { get; set; }
- TempData 用来进行跨页面请求传值。
- TempData被请求后生命周期即结束。
- 从TempData中取值时需要进行类型转换和Null Check以避免异常。
- 主要用来存储一次性数据信息,比如error messages, validation messages。
详情可参考:TempData知多少,
Session - ASP.NET MVC中Session是Controller中的一个属性,Session是HttpSessionStateBase类型。
public HttpSessionStateBase Session { get; }
- Session保存数据直到用户会话结束(默认session过期时间为20mins)。
- Session对所有的请求都有效,不仅仅是单一的跳转。
- 从Session中取值时需要进行类型转换和Null Check以避免异常。
Q51. 如何持久化TempData?
Ans. TempData的生命周期十分短暂,只能存活到目标视图完全加载之后。
但是我们可以通过调用Keep
方法去持久化TempData至下一次访问。
- void Keep() - 调用这个方法将保证此次请求之后所有的TempData都将会被持久化。
public ActionResult Index()
{
ViewBag.Message = TempData["Message"];
Employee emp = TempData["emp"] as Employee; //need type casting
TempData.Keep();//persist all strings values
return View();
}
- void Keep(string key) - 调用这个方法将保证此次请求之后指定的TempData会被持久化。
public ActionResult Index()
{
ViewBag.Message = TempData["Message"];
Employee emp = TempData["emp"] as Employee; //need type casting
//persist only data for emp key and Message key will be destroy
TempData.Keep("emp");
return View();
}
Q52. ASP.NET MVC中如何控制session的行为?
Ans. 默认ASP.NET MVC 支持 session state(会话状态). Session用来存储跨请求
期间的数据。 不管你是否在session中存储数据,ASP.NET MVC都必须为所有的controller管理 session state,且是耗时的 。因此session是存储在服务器端的,消耗服务器的内存,所以必然影响你的应用程序的性能。 如果你的某些controller不需要session控制,可以手动关闭session控制,来增加微小的性能提升。
可以通过 session state的配置项来简化它。
ASP.NET MVC4中的SessionState
特性中,可以通过指定SessionStateBehavior
枚举来实现更多对session-state的控制。
- Default :默认的session state控制方式。
- Disabled: Session state完全关闭。
- ReadOnly:只读的session state。
- Required:完全的可读写的 session state。
Q53. ASP.NET MVC中 TempData与Session 有什么关联关系?
Ans. ASP.NET MVC中TempData使用session存储跨请求的临时数据。因此,当你关闭了controller的session,当你去使用TempData时,就会抛出以下异常。
Q54. ASP.NET MVC中什么是Action方法?
Ans. Controller中的action是定义在Controller类中的方法用来执行基于用户请求的操作,并在Model的帮助下将结果传递会View。
Asp.net MVC 中集成了以下几种ActionResults类型及对应的帮助类方法:
- ViewResult - 使用Controller中提供的
View()
方法返回一个ViewResult用来呈现指定或默认的View。 - PartialViewResult- 使用Controller中提供的
PartialView()
方法返回一个PartialViewResult用来呈现指定或默认的分部视图。 - RedirectResult - 使用Controller中提供的
Redirect()
方法返回一个RedirectResult用来发起一个 HTTP 301 或 302 到指定URL的跳转。 - RedirectToRouteResult - 使用Controller中提供的
RedirectToAction(), RedirectToActionPermanent(), RedirectToRoute(), RedirectToRoutePermanent()
方法返回一个RedirectToRouteResult用来发起一个 HTTP 301或 302 到指定action或者路由的跳转。 - ContentResult - 使用Controller中提供的
Content()
方法返回一个ContentResult用来呈现指定的文本。 - JsonResult - 使用Controller中提供的
Json()
方法返回一个JsonResult用来呈现序列化的Json格式数据。 - JavaScriptResult - 使用Controller中提供的
JavaScript()
方法返回一个JavaScriptResult用来呈现一段JavaScript代码,一般仅用于Ajax请求的场景。 - FileResult - 使用Controller中提供的
File()
方法返回一个FileResult用来呈现文件(PDF, DOC, Excel等)内容。 - EmptyResult - 返回一个空的结果。
- HttpNotFoundResult - 使用Controller中提供的
HttpNotFound()
方法返回一个HTTP 404状态。 - HttpUnauthorizedResult - 返回一个HttpUnauthorizedResult类型用来表示HTTP 401状态(未认证)。用来要求用户登录以完成认证。
- HttpStatusCodeResult - 返回 HttpStatusCodeResult用来表示指定Http状态。
Q56. ASP.NET MVC中如何标记Non-Action方法?
Ans. ASP.NET MVC 将所有的公共方法默认为action方法。
如果不想某个公共的方法被暴露为Action,仅需要用NonActionAttribute
标记方法即可。
[NonAction]
public void DoSomething()
{
// Method logic
}
Q57. 能否更改Action方法的命名?
Ans. 可以通过ActionName
特性来修改Action的命名。修改后Action将用ActionName
中定义的名称被调用。
[ActionName("DoAction")]
public ActionResult DoSomething()
{
//TODO:
return View();
}
这样,DoSomething
action就会被会被标记为DoAction
action。
Q58. 如何限制action仅能被相应的HTTP GET, POST, PUT or DELETE请求访问?
Ans. 默认,每一个action方法都可以被任何HTTP请求访问(i.e. GET, PUT, POST,
DELETE). 但是可以通过为action方法指定HttpPost、 HttpPut 、 HttpDelete 特性来限制action的行为。
[HttpGet]
public ActionResult Index()
{
//TODO:
return View();
}
Q59. 如何决定一个action是被HTTP GET还是POST请求?
Ans. 通过使用HttpRequestBase
类的HttpMethod
属性可以判断action是被哪种HTTP请求调用。
public ActionResult Index(int? id)
{
if (Request.HttpMethod == "GET")
{
//TODO:
}
else if (Request.HttpMethod == "POST")
{
//TODO:
}
else
{
//TODO:
}
return View();
}
Q60. 如何判断一个AJAX请求?
Ans. 通过使用Request.IsAjaxRequest()
来判断。
public ActionResult DoSomething()
{
if (Request.IsAjaxRequest())
{
//TODO:
}
return View();
}
Asp.net mvc 知多少(五)的更多相关文章
- Asp.net mvc 知多少(六)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Asp.net mvc 知多少(七)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Asp.net mvc 知多少(八)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问[http: ...
- Asp.net mvc 知多少(九)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Asp.net mvc 知多少(十)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Asp.net mvc 知多少(一)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Asp.net mvc 知多少(四)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- ASP.NET MVC Model验证(五)
ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...
- ASP.NET MVC Model绑定(五)
ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本 ...
随机推荐
- 团队工作准则&贡献分配规则
团队工作准则&贡献分配规则 NewTeam 2017/10/24 v1.0 工作准则及内容 全体成员 所有成员在接受任务时应结合自身情况考虑,如果认为任务内容或时间有不合理之处应当立即提出修改 ...
- ML技术 - 特征选择
1. 决策树中的特征选择 分类决策树是一种描述对实例进行分类的树型结构,决策树学习本质上就是从训练数据集中归纳出一组分类规则,而二叉决策树类似于if-else规则.决策树的构建也是非常的简单,首先依据 ...
- SQLSERVER实现更改表名,更改列名,更改约束代码
1.修改表名 格式:sp_rename tablename,newtablename ? 1 sp_rename tablename,newtablename 2.修改字段名 格式:sp_rename ...
- [转载] Bitmap的秘密
转载自http://www.infoq.com/cn/articles/the-secret-of-bitmap/ 之前已经参加过几次QCon峰会,不过今年QCon 2014 上海峰会对我来说比较特别 ...
- [转载] HBase vs Cassandra:我们迁移系统的原因
转载自http://www.csdn.net/article/2010-11-29/282698 我的团队近来正在忙于一个全新的产品——即将发布的网络游戏www.FightMyMonster.com. ...
- iOS获取所有机型
1.手机系统版本:9.1 NSString* phoneVersion = [[UIDevice currentDevice] systemVersion]; 2.手机类型:iPhone 6 NSSt ...
- SparkStreaming动态读取配置文件
SparkStreaming动态读取配置文件 标签: SparkStreaming HDFS 配置文件 MySql 需求 要实现SparkStreaming在流处理过程中能动态的获取到配置文件的改变 ...
- java并发之线程同步(synchronized和锁机制)
使用synchronized实现同步方法 使用非依赖属性实现同步 在同步块中使用条件(wait(),notify(),notifyAll()) 使用锁实现同步 使用读写锁实现同步数据访问 修改锁的公平 ...
- 使用dropwizard(6)-国际化-easy-i18n
前言 Dropwizard官方文档并没有提供国际化的模块,所以只能自己加.Spring的MessageResource用的很顺手,所以copy过来. Easy i18n 在整合Dropwizard的时 ...
- Winform远程更新代码
本软件具备以下形: 1.通过http形式在客户端更新winform代码文件 2.在服务端通过软件生成xml配置文件,客户端通过比对xml配置文件来更新代码文件. 服务端: 在服务器上建立一个IIS发布 ...