本系列主要翻译自《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类型及对应的帮助类方法:

  1. ViewResult - 使用Controller中提供的View()方法返回一个ViewResult用来呈现指定或默认的View。
  2. PartialViewResult- 使用Controller中提供的 PartialView()方法返回一个PartialViewResult用来呈现指定或默认的分部视图。
  3. RedirectResult - 使用Controller中提供的 Redirect()方法返回一个RedirectResult用来发起一个 HTTP 301 或 302 到指定URL的跳转。
  4. RedirectToRouteResult - 使用Controller中提供的RedirectToAction(), RedirectToActionPermanent(), RedirectToRoute(), RedirectToRoutePermanent()方法返回一个RedirectToRouteResult用来发起一个 HTTP 301或 302 到指定action或者路由的跳转。
  5. ContentResult - 使用Controller中提供的 Content()方法返回一个ContentResult用来呈现指定的文本。
  6. JsonResult - 使用Controller中提供的 Json()方法返回一个JsonResult用来呈现序列化的Json格式数据。
  7. JavaScriptResult - 使用Controller中提供的 JavaScript()方法返回一个JavaScriptResult用来呈现一段JavaScript代码,一般仅用于Ajax请求的场景。
  8. FileResult - 使用Controller中提供的 File()方法返回一个FileResult用来呈现文件(PDF, DOC, Excel等)内容。
  9. EmptyResult - 返回一个空的结果。
  10. HttpNotFoundResult - 使用Controller中提供的 HttpNotFound()方法返回一个HTTP 404状态。
  11. HttpUnauthorizedResult - 返回一个HttpUnauthorizedResult类型用来表示HTTP 401状态(未认证)。用来要求用户登录以完成认证。
  12. 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 知多少(五)的更多相关文章

  1. Asp.net mvc 知多少(六)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...

  2. Asp.net mvc 知多少(七)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...

  3. Asp.net mvc 知多少(八)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问[http: ...

  4. Asp.net mvc 知多少(九)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...

  5. Asp.net mvc 知多少(十)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...

  6. Asp.net mvc 知多少(一)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...

  7. Asp.net mvc 知多少(四)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...

  8. ASP.NET MVC Model验证(五)

    ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...

  9. ASP.NET MVC Model绑定(五)

    ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本 ...

随机推荐

  1. 二:Redis快速入门及应用

    Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...

  2. 机器学习(二)-kNN手写数字识别

    一.kNN算法是机器学习的入门算法,其中不涉及训练,主要思想是计算待测点和参照点的距离,选取距离较近的参照点的类别作为待测点的的类别. 1,距离可以是欧式距离,夹角余弦距离等等. 2,k值不能选择太大 ...

  3. 高性能分布式执行框架——Ray

    Ray是UC Berkeley AMP实验室新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室阶 ...

  4. 开始python成长之路

    因为某种特殊原因很不幸的得了脱髓鞘 正要去实习 大展身手 甚至公司都选好了 可就在这个节骨眼..得了传说中的脱髓鞘.经过一年的修养 我决定还是要站起来 毕竟一生的时间很长 这一段时间 我都在玩游戏赚钱 ...

  5. 最大似然估计 (Maximum Likelihood Estimation), 交叉熵 (Cross Entropy) 与深度神经网络

    最近在看深度学习的"花书" (也就是Ian Goodfellow那本了),第五章机器学习基础部分的解释很精华,对比PRML少了很多复杂的推理,比较适合闲暇的时候翻开看看.今天准备写 ...

  6. jq实现全选或者全不选

    $("#all").click(function () { if($(this).is(":checked")){ $("input[name='pr ...

  7. 《java.util.concurrent 包源码阅读》04 ConcurrentMap

    Java集合框架中的Map类型的数据结构是非线程安全,在多线程环境中使用时需要手动进行线程同步.因此在java.util.concurrent包中提供了一个线程安全版本的Map类型数据结构:Concu ...

  8. 作为新手 HTML5如何自学为好?

    互联网发展到今天,越来越多的技术岗位人才出现了稀缺的状态,就拿当前的HTML5来讲,基本成为了每家互联网公司不可缺少的人才.如果抓住这个机会,把HTML5搞好,那么前途不可限量,而且这门行业是越老越吃 ...

  9. TFBOY 养成记 一些比较好多文章。

    API解释中文版(简书文章,没事看看): http://www.jianshu.com/p/e3a79eac554f Tensorlfow op辨异:tf.add()与tf.nn.bias_add() ...

  10. vue+echarts 动态绘制图表以及异步加载数据

    前言 背景:vue写的后台管理,需要将表格数据绘制成图表(折线图,柱状图),图表数据都是通过接口请求回来的. 安装 cnpm install echarts --s (我这里用了淘宝镜像,不知道同学自 ...