ASP.NET MVC面试问题与答案

什么是MVC(模型视图控制器)?
MVC是一种将表示和用户交互分开的体系结构模式。它分为三个更广泛的部分:模型,视图和控制器。以下是他们每个人处理任务的方式。

视图负责外观。
模型代表现实世界的对象,并向视图提供数据。
控制器负责接收最终用户的请求并加载适当的模型和视图
解释MVC应用程序的生命周期?
MVC应用程序生命周期中发生了六个更广泛的事件,如下图所示。

图片3
图片提供:-http: //www.dotnetinterviewquestions.in/article_explain-mvc-application-life-cycle_210.html

任何Web应用程序都有两个主要的执行步骤,首先是了解请求,然后根据请求的类型发出适当的响应。MVC应用程序的生命周期没有什么不同,它有两个主要阶段,一个是创建请求对象,另一个是将响应发送到浏览器。

创建请求对象:-创建请求对象有四个主要步骤。以下是相同的详细说明。

步骤1填充路由: -MVC请求映射到路由表,路由表又指定要调用哪个控制器和动作。因此,如果请求是第一个请求,那么第一件事就是用路由集合填充路由表。路由表的填充发生在global.asax文件中。

步骤2提取路由:-根据发送的URL,“ UrlRoutingModule”搜索路由表以创建“ RouteData”对象,该对象具有要调用的控制器和操作的详细信息。

步骤3创建请求上下文:- “ RouteData”对象用于创建“ RequestContext”对象。

步骤4创建控制器实例:-该请求对象被发送到“ MvcHandler”实例以创建控制器类实例。创建控制器类对象后,它将调用控制器类的“ Execute”方法。

创建响应对象:-此阶段包含两个步骤,执行操作,最后将响应结果发送到视图。

MVC是否适用于Windows和Web应用程序?
MVC体系结构比Windows更适合Web应用程序。对于Window应用程序,MVP(即“ Model View Presenter”)更适用。如果使用WPF和Silverlight,则由于绑定,MVVM更适合。

使用MVC有什么好处?
MVC有两个主要优点:

当我们将后台代码移动到单独的类文件中时,就可以实现关注点的分离。通过将绑定代码移动到单独的类文件中,我们可以在很大程度上重用代码。
可以进行自动化的UI测试,因为现在后台代码(UI交互代码)已移至简单的.NET类。这给了我们编写单元测试和自动化手动测试的机会。
MVC与三层体系结构不同吗?
MVC是三层传统体系结构的演变。三层体系结构的许多组件都是MVC的一部分。因此,下面是映射的过程:

功能性 三层/分层架构 模型视图控制器架构
外观 用户界面 视图
UI逻辑 用户界面 控制者
业务逻辑/验证 中间层 模型
请求首先发送到 用户界面 控制者
存取资料 资料存取层 资料存取层
图片4

图:三层架构
什么是MVC的最新版本?
MVC 6是最新版本,也称为ASP VNEXT。

MVC 2、3、4、5和6的每个版本之间有什么区别?
MVC 6

ASP.NET MVC和Web API已合并为一个。

依赖注入是内置的,是MVC的一部分。

并排-与您的应用程序一起部署运行时和框架

NuGet打包的所有内容,包括.NET运行时本身。

新的基于JSON的项目结构。

无需为每个更改重新编译。只需点击保存并刷新浏览器。

使用新的Roslyn实时编译器进行编译。

vNext是通过.NET Foundation开放的源代码,并且正在为公众做出贡献。

vNext(和Rosyln)现在也可以在Mac和Linux的Mono上运行。

MVC 5

一个ASP.NET

基于属性的路由

ASP.NET身份

MVC模板中的引导程序

认证过滤器

过滤器替代

MVC 4

ASP.NET Web API

刷新和现代化的默认项目模板

新的移动项目模板

支持移动应用程序的许多新功能

增强了对异步方法的支持

MVC 3

剃刀

现成的项目模板

启用HTML 5的模板

支持多个视图引擎

JavaScript和Ajax

模型验证改进

MVC 2

客户端验证

模板化助手

地区

异步控制器

HTML.ValidationSummary Helper方法

操作方法参数中的DefaultValueAttribute

使用模型绑定器绑定二进制数据

DataAnnotations属性

模型验证提供者

新的RequireHttpsAttribute操作筛选器

模板化助手

显示模型级错误

什么是MVC中的HTML帮助器?
HTML帮助器可帮助您在视图中呈现HTML控件。例如,如果要在视图上显示HTML文本框,则下面是HTML帮助程序代码。

<%= Html.TextBox(“姓氏”)%>
下面的复选框是HTML帮助程序代码。这样,我们为每个存在的HTML控件提供了HTML帮助器方法。

<%= Html.CheckBox(“已婚”)%>
“ HTML.TextBox”和“ HTML.TextBoxFor”有什么区别?
两者都提供相同的HTML输出,“ HTML.TextBoxFor”是强类型的,而“ HTML.TextBox”则不是。下面是一个简单的HTML代码,该代码仅创建一个简单的文本框,名称为“ CustomerCode”。

Html.TextBox(“ CustomerCode”)
下面是“ Html.TextBoxFor”代码,该代码使用对象“ m”的属性名称“ CustomerCode”创建HTML文本框。

Html.TextBoxFor(m => m.CustomerCode)
以与其他HTML控件相同的方式,例如复选框,我们具有“ Html.CheckBox”和“ Html.CheckBoxFor”。

MVC中的路由是什么?
路由可帮助您定义URL结构并使用控制器映射URL。

例如,假设我们希望当用户键入“ http:// localhost / View / ViewCustomer / ”时,它进入“ Customer”控制器并调用该DisplayCustomer动作。这是通过routes使用maproute函数将一个条目添加到集合中来定义的。下面带下划线的代码显示了如何定义URL结构以及带有控制器和操作的映射。

route.MapRoute(
“ View”,//路线名称
“ View / ViewCustomer / {id}”,//带有参数的URL
新建{控制器=“客户”,操作=“ DisplayCustomer”,
id = UrlParameter.Optional}); //参数默认值
路由映射代码写在哪里?
路由映射代码写入“ RouteConfig.cs”文件中,并使用“ global.asax”应用程序启动事件进行注册。

我们可以将多个URL映射到同一操作吗?
是的,您可以,您只需要输入两个具有不同键名的条目并指定相同的控制器和动作即可。

解释在MVC中基于属性的路由?
这是MVC 5中引入的功能。通过使用“ Route”属性,我们可以定义URL结构。例如,在下面的代码中,我们用route属性装饰了“ GotoAbout”动作。route属性表示可以使用URL结构“ Users / about”来调用“ GotoAbout”。

公共类HomeController:控制器
{
[路线(“用户/关于”)
公共ActionResult GotoAbout()
{
返回View();
}
}
在代码中定义路由结构的好处是什么?
大多数时候,开发人员在操作方法中进行编码。开发人员可以直接看到URL结构,而不必转到“ routeconfig.cs”并看到冗长的代码。例如,在下面的代码中,开发人员可以从前面看到,可以通过四个不同的URL结构调用“ GotoAbout”操作。

与滚动浏览“ routeconfig.cs”文件并遍历代码的长度行以找出将哪个URL结构映射到哪个操作相比,这对用户非常友好。

公共类HomeController:控制器
{
[路线(“用户/关于”)
[Route(“ Users / WhoareWe”)]
[Route(“ Users / OurTeam”)]
[路线(“用户/关于公司”)
公共ActionResult GotoAbout()
{
返回View();
}
}
我们如何使用超链接从一个视图导航到另一个视图?
通过使用ActionLink以下代码中所示的方法。下面的代码将创建一个简单的URL,该URL有助于导航到“ Home”控制器并调用GotoHome操作。

<% = Html.ActionLink(“ Home”,“ Gotohome”)%>
我们如何限制仅由GET或POST调用的MVC操作?
我们可以使用HttpGet或HttpPost属性修饰MVC操作,以限制HTTP调用的类型。例如,您可以在下面的代码片段中看到该DisplayCustomer操作只能由调用HttpGet。如果尝试在上进行HTTP POST DisplayCustomer,则会抛出错误。

[HttpGet]
公共ViewResult DisplayCustomer(int id)
{
客户objCustomer =客户[id];
返回View(“ DisplayCustomer”,objCustomer);
}
我们如何在MVC中维护会话?
可以通过三种方式在MVC中维护会话:tempdata,viewdata和viewbag。

tempdata,viewdata和viewbag有什么区别?
图片5

图:tempdata,viewdata和viewbag之间的区别
临时数据-当您从一个控制器移至另一控制器或从一个动作移至另一动作时,有助于维护数据。换句话说,当您重定向时,tempdata有助于在这些重定向之间维护数据。它在内部使用会话变量。
查看数据-当您从控制器移至视图时,有助于维护数据。
View Bag-这是围绕视图数据的动态包装。使用Viewbag类型时,不需要强制转换。它在dynamic内部使用关键字。
图片6

图:动态关键字
会话变量-通过使用会话变量,我们可以维护从任何实体到​​任何实体的数据。
隐藏字段和HTML控件-仅用于维护从UI到控制器的数据。因此,您可以使用POST或GET HTTP方法将数据从HTML控件或隐藏字段发送到控制器。
下面的摘要表显示了不同的持久性机制。

维护数据之间 ViewData / ViewBag 临时数据 隐藏的字段 届会
控制器对控制器 没有 是 没有 是
控制器查看 是 没有 没有 是
查看控制器 没有 没有 是 是
TempData和ViewData有什么区别?
“ TempData”维护整个请求的数据,而“ ViewData”仅维护从Controller到视图的数据。

“ TempData”是否还会在下一个请求中保留数据?
对于当前请求,“ TempData”始终可用,在后续请求中,取决于是否读取“ TempData”,是否可用。

因此,如果一次读取了“ TempData”,它将在后续请求中不可用。

“ TempData”中的Keep和Peek有什么用?
在当前请求中读取“ TempData”后,在后续请求中将不可用。如果我们希望“ TempData”被读取并在后续请求中也可用,那么在读取之后,我们需要调用“ Keep”方法,如下面的代码所示。

@TempData [ “ MyData” ];
TempData.Keep(“ MyData”);
实现此目的的更捷径是使用“ Peek”。该功能还有助于阅读MVC建议,以维护后续请求的“ TempData”。

字符串str = TempData.Peek(“ Td”). ToString ();
如果您想了解更多详细信息,可以从MVC Peek and Keep上的这个详细博客中阅读。

MVC中的局部视图是什么?
局部视图是可重用的视图(如用户控件),可以嵌入其他视图中。例如,假设您网站的所有页面都具有标准结构,包括左侧菜单,页眉和页脚,如下图所示。

图片7

图:MVC中的局部视图
对于每个页面,您都想重用左侧菜单,页眉和页脚控件。因此,您可以为每个项目创建局部视图,然后在主视图中调用该局部视图。

您如何创建局部视图并使用它?
将视图添加到项目时,需要选中“创建局部视图”复选框。

图片8

图:创建局部视图
创建局部视图后,您可以使用Html.RenderPartial下面的代码片段所示的方法在主视图中调用局部视图:

<正文>
< div >
<% Html.RenderPartial(“ MyView”); %>
< / div >
< / body >
我们如何在MVC中进行验证?
在MVC中进行验证的最简单方法之一是使用数据注释。数据注释不过是可以应用于模型属性的属性。例如,在下面的代码片段中,我们有一个Customer带有property的简单类customercode。

此CustomerCode属性标记有Required数据注释属性。换句话说,如果未提供此模型的客户代码,它将不会接受。

公共 类客户
{
[Required(ErrorMessage = “必须输入客户代码”)]
公共 字符串CustomerCode
{
设置;
得到;
}
}
为了显示验证错误消息,我们需要使用ValidateMessageFor属于Htmlhelper类的方法。

<% 使用(Html.BeginForm(“ PostCustomer”,“ Home”,FormMethod.Post))
{ %>
<% = Html.TextBoxFor(m = > m.CustomerCode)%>
<% = Html.ValidationMessageFor(m = > m.CustomerCode)%>
<输入类型=“提交”值=“提交客户数据” / > <% } %>

稍后,在控制器中,我们可以使用ModelState.IsValid属性检查模型是否正确,并据此采取措施。

公共ActionResult PostCustomer(客户obj)
{
如果(ModelState.IsValid)
{
obj.Save();
返回View(“谢谢”);
}
其他
{
返回View(“ Customer”);
}
}
下面是有关错误消息如何在视图上显示的简单视图。

图片9

图:MVC中的验证
我们可以一次性显示所有错误吗?
我们可以; 使用助手类中的ValidationSummary方法Html。

<% = Html.ValidationSummary()%>
在MVC中用于验证的其他数据注释属性还有哪些?

如果要检查字符串长度,可以使用StringLength。

[StringLength(160)]
公共 字符串FirstName { get ; 设置; }
如果要使用正则表达式,可以使用RegularExpression属性。

[RegularExpression(@“ [A-Za-z0-9 ._%±] + @ [A-Za-z0-9 .-] + \。[A-Za-z] {2,4}”)]公用 字符串Email { get ; 设置; }
如果要检查数字是否在范围内,可以使用该Range属性。

[范围(10,25)]公共 INT年龄{ GET ; 设置; }
有时您想将一个字段的值与另一个字段的值进行比较,我们可以使用Compare属性。

公共 字符串密码{ get ; 设置; } [Compare(“ Password”)]公共 字符串ConfirmPass { get ; 设置; }
如果要获取特定的错误消息,可以使用该Errors集合。

var ErrMessage = ModelState [ “ Email” ] .Errors [ 0 ] .ErrorMessage;
如果您自己创建了模型对象,则可以TryUpdateModel在控制器中显式调用以检查该对象是否有效。

TryUpdateModel(NewCustomer);
如果要在控制器中添加错误,可以使用该AddModelError功能。

ModelState.AddModelError(“ FirstName”,“这是我的服务器端错误。”);
我们如何在客户端启用数据注释验证?
这是一个两步过程:首先引用必要的jQuery文件。

猜你喜欢

转载自blog.csdn.net/weixin_52630329/article/details/111052321