 分类:
    .NET
    
    分类:
    .NET
读这篇文章不意味着你一定要去并且能搞定MVC面试。这篇文章的目的是在面试之前让你快速复习MVC知识。
什么是MVC (模型 视图 控制器)?
MVC是一个架构模式,它分离了表现与交互。它被分为三个核心部件:模型、视图、控制器。下面是每一个部件的分工:
- 视图是用户看到并与之交互的界面。 
- 模型表示业务数据,并提供数据给视图。 
- 控制器接受用户的输入并调用模型和视图去完成用户的需求。 

图: MVC (模型、视图、控制器)
你能解释下MVC的完整流程吗?
下面是MVC(模型、视图、控制器)架构的控制流程:
- 所有的终端用户请求被发送到控制器。 
- 控制器依赖请求去选择加载哪个模型,并把模型附加到对应的视图。 
- 附加了模型数据的最终视图做为响应发送给终端用户。 
MVC同时适用于Windows应用和Web应用吗?
相比Windows应用,MVC架构更适用于Web应用。对于Windows应用,MVP(Model View Presenter )架构更好一点。如果你使用WPF和Silverlight,MVVM更适合。
使用MVC有哪些好处?
MVC有两个大的好处:
- 分离了关注点。后台代码被移到单独的类文件,我们可以最大限度的重复利用代码。 
- 自动化UI测试成为可能,因为后台代码移到了.NET类。这让我们更容易做单元测试和自动化测试。 
MVC不同于三层架构?
MVC是三层传统架构的演变。三层架构和MVC有一些通用的组成部分。 显示如下:
| 功能性 | 三层 / 分层架构 | Model view controller architecture | 
| 显示与交互 | 用户界面 | 视图 | 
| UI逻辑 | 用户界面 | 控制器 | 
| 商业逻辑 / 验证 | 中间层 | 模型 | 
| 请求首先发送给谁? | 用户界面 | 控制器 | 
| 访问数据 | 数据链接层 | 数据链接层 | 

图示: 三层架构
MVC的最新版本是哪个?
在写这篇文章时MVC已经发行了4个版本:MVC 1 , MVC 2, MVC 3, 和 MVC 4. 所以 MVC 4是最新版本。
每个版本的MVC有什么不同?
下面的表格列出了详细的不同点。但是在面试中限于时间问题,很难去说出所有的东西。所以,我标出了所有重要区别。
| MVC 2 | MVC 3 | MVC 4 | 
| 
 | 
 | 
 | 
MVC中的HTML helpers是什么?
HTML helpers帮助你渲染视图中的HTML控件。如果在面试中你想展示HTML输入框,下面是HTML helper代码。
<%= Html.TextBox("LastName") %>checkbox的代码如下。用这种方式我们可以创建现存的所有HTML控件。
<%= Html.CheckBox("Married") %>“HTML.TextBox” 和 “HTML.TextBoxFor”有什么不同?
它们两个输出相同的HTML, “HTML.TextBoxFor”是强类型的,但 “HTML.TextBox”不是。下面是一个实例,它仅仅创建了一个名字为 “CustomerCode”的输入框。
Html.TextBox("CustomerCode")下面的代码是用 “Html.TextBoxFor” 创建的HTML输入框,从对象"m"中调用了属性”CustomerCode “。
Html.TextBoxFor(m => m.CustomerCode)
相同的方式,我们可以用“Html.CheckBox” 和 “Html.CheckBoxFor”创建checkbox。
MVC的路由选择是什么?
路由选择功能帮你定义一个URL规则,映射URL到控制器。
举一个例子,我们想让用户输入“ http://localhost/View/ViewCustomer/ ”时,它转向到“Customer”控制器并且调用 DisplayCustomer 。这个通过Maproute方法来定义。代码如下:
routes.MapRoute(               "View", // Route name               "View/ViewCustomer/{id}", // URL with parameters               new { controller = "Customer", action = "DisplayCustomer", 
id = UrlParameter.Optional }); // Parameter defaults在哪里写路由映射表?
在 “ global.asax ” 文件。
我们可以映射多个URL到同一个动作吗?
是的,可以。只需要添加多条不同Key名字的记录,并且指定同样的控制器和动作。
使用hyperlink生成链接,如何从一个视图链接到另一个视图?
使用 ActionLink 方法,如下图所示。下面的代码生成一个简单的URL,链接到"Home"控制器的GotoHome动作。
<%= Html.ActionLink("Home","Gotohome") %>如何限制一个动作的类型为GET或POST?
我们可以给MVC的动作一个HttpGet或HttpPost属性去限制HTTP的类型。你可以看下面的代码段,这个 DisplayCustomer 动作只能用HttpGet方式访问。如果我们尝试用Http post的方式,会看到错误信息。
在MVC中如何保持Sessions?
可以通过三种方式保持: tempdata, viewdata, 和viewbag。
tempdata, viewdata, 和 viewbag之间有什么不同?

图示: tempdata, viewdata, 和viewbag之间不同点
- Temp data -在不同的控制器或动作间转换时保持数据。另外,进行页面转向时,tempdata可以保持数据。它是一个内部的Session变量。 
- View data - 可以在控制器和视图间保持数据。 
- View Bag - 它是视图数据的动态包装。使用Viewbag不需要类型转换。它使用的是内部动态关健词。 

图示: 动态关键词
- Session 变量 - 使用Session变量可以在任何实体间保持数据。 
- 隐藏字段和HTML控件 - 只能何持数据从UI到Controller。可以使用HTML控制器或隐藏字段,用HTTP方式(POST或GET)发送数据到控制器。 
下表是汇总:
| Maintains data between | ViewData/ViewBag | TempData | Hidden fields | Session | 
| Controller to Controller | No | Yes | No | Yes | 
| Controller to View | Yes | No | 
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
 50010702506256
50010702506256
         
         
         
         
        