- MVC 框架教程
- MVC 框架 - 首页
- MVC 框架 - 简介
- MVC 框架 - 架构
- MVC 框架 - ASP.NET 表单
- MVC 框架 - 第一个应用程序
- MVC 框架 - 文件夹
- MVC 框架 - 模型
- MVC 框架 - 控制器
- MVC 框架 - 视图
- MVC 框架 - 布局
- MVC 框架 - 路由引擎
- MVC 框架 - 操作过滤器
- 高级示例
- MVC 框架 - Ajax 支持
- MVC 框架 - 捆绑
- 异常处理
- MVC 框架有用资源
- 问答
- MVC 框架 - 快速指南
- MVC 框架 - 资源
- MVC 框架 - 讨论
ASP.NET MVC 面试问题
亲爱的读者,这些ASP.NET MVC 面试问题是专门设计用来让您熟悉在ASP.NET MVC主题的面试中可能遇到的问题类型的。根据我的经验,优秀的访谈者在面试期间很少计划要问任何特定问题,通常问题从主题的一些基本概念开始,然后根据进一步的讨论以及您的回答继续进行。
ASP.Net MVC 是一种模式,用于将应用程序的实现逻辑拆分为三个组件,即模型、视图和控制器。
模型:它基本上是一个业务实体,用于表示应用程序数据。控制器:用户发送的请求始终通过控制器传递,它的职责是使用 View() 方法重定向到特定的视图。视图:它是 ASP.Net MVC 的表示层。
新增的功能如下:添加了移动模板。添加了用于创建基于 REST 的服务的 ASP.NET Web API 模板。异步控制器任务支持。Java 脚本的捆绑。为 ASP.Net MVC 路由、Web API、Bundle 等分离配置。
以下是按顺序执行的过程:
- 应用程序初始化
- 路由
- 实例化并执行控制器
- 定位并调用控制器操作
- 实例化并呈现视图。
- 在 UI(表示层)、模型(传输对象/域对象/实体)和业务逻辑(控制器)之间提供了清晰的分离关注点。
- 易于进行单元测试。
- 提高了模型和视图的可重用性。我们可以有多个视图可以指向同一个模型,反之亦然。
- 改进了代码结构。
它是将程序分解成各种不同的功能的过程,这些功能的功能重叠尽可能少。ASP.Net MVC 模式关注于将内容与表示以及数据处理与内容分离。
Razor 是在 ASP.Net MVC 3 中渲染 HTML 的第一个主要更新。Razor 专为视图引擎语法而设计。其主要重点是简化和代码化的 HTML 生成模板。以下是使用 Razor 的示例
@model ASP.Net MVCMusicStore.Models.Customer @{ViewBag.Title = "Get Customers";} < div class="cust"> <h3><em>@Model.CustomerName</<em> </<h3><div>
这是一个通用术语,传达了一种普遍的理念,类似于 REST(表述性状态转移)术语。非侵入式 JavaScript 不会将 JavaScript 代码混合到页面标记中。例如:不是使用 onclick 和 onsubmit 等事件,非侵入式 JavaScript 通过其 ID 或类根据 HTML5 数据属性附加到元素。
视图模型是一个带有属性的普通类,用于将其绑定到强类型视图。视图模型可以使用数据注释为其属性定义验证规则。
路由是将传入请求与路由表中注册的 URL 模式进行匹配的模式匹配机制。类:“UrlRoutingModule”用于同一过程。
操作是控制器类中的方法,负责返回视图或 json 数据。操作主要具有返回类型:“ActionResult”,并且将从方法:“InvokeAction()”调用,该方法由控制器调用。
ASP.NET Web API 支持这种类型的路由。这在 ASP.Net MVC5 中引入。在这种类型的路由中,属性用于定义路由。这种类型的路由可以更好地控制经典 URI 路由。属性路由可以在控制器级别或操作级别定义,例如
[Route("{action = TestCategoryList}")] - Controller Level [Route("customers/{TestCategoryId:int:min(10)}")] - Action Level
只需将 @Model.CustomerName 方法:“MapASP.Net MVCAttributeRoutes()”添加到启用属性路由,如下所示
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //enabling attribute routing routes.MapASP.Net MVCAttributeRoutes(); //convention-based routing routes.MapRoute ( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Customer", action = "GetCustomerList", id = UrlParameter.Optional } ); }
JavaScript 对象表示法 (JSON) 绑定支持从 ASP.Net MVC3 开始通过新的 JsonValueProviderFactory 提供,该工厂允许操作方法以 JSON 格式接受和模型绑定数据。这在 Ajax 场景(如客户端模板和需要将数据发布回服务器的数据绑定)中很有用。
依赖项解析器在 ASP.Net MVC3 中也已引入,它极大地简化了在应用程序中使用依赖项注入。这使得解耦应用程序组件并使其更易于测试和更易于配置变得更容易和更有用。
ASP.Net MVC4 中的“BundleConfig.cs”用于通过捆绑和缩小系统注册捆绑包。默认情况下添加了许多捆绑包,包括 jQuery 库,如 jquery.validate、Modernizr 和默认 CSS 引用。
方法:“RegisterRoutes()”用于注册将添加到 global.asax 文件的“Application_Start()”方法中的路由,该方法在应用程序加载或启动时触发。
以下是 ASP.Net MVC 中使用的一些重要命名空间:
- System.Web.ASP.Net MVC
- System.Web.ASP.Net MVC.Ajax
- System.Web.ASP.Net MVC.Html
- System.Web.ASP.Net MVC.Async
Viewdata 包含作为字典的键值对,它派生自类:“ViewDataDictionary”。在操作方法中,我们为 viewdata 设置值,在视图中,通过类型转换获取值。
ViewBag 是 ViewData 的包装器,它允许创建动态属性。viewbag 相对于 viewdata 的优势在于:在 ViewBag 中,不需要像 ViewData 中那样对对象进行类型转换。ViewBag 将利用在 4.0 版本中引入的动态关键字。但在使用 ViewBag 之前,我们必须记住 ViewBag 比 ViewData 慢。
TempData 与 ViewData 一样,也是一个键值对。它派生自“TempDataDictionary”类。TempData 用于在两个连续请求中使用数据时,这可能在操作之间或控制器之间。这需要在视图中进行类型转换。
HTML 帮助器就像传统 Web 窗体中的控件。但是 HTML 帮助器比 Web 控件更轻量级,因为它不保存视图状态和事件。HTML 帮助器返回 HTML 字符串,该字符串可以直接呈现到 HTML 页面。还可以通过覆盖“HtmlHelper”类来创建自定义 HTML 帮助器。
AJAX 帮助器用于创建启用 AJAX 的元素,例如启用 AJAX 的表单和链接,这些元素异步执行请求,并且是存在于命名空间 System.Web.ASP.Net MVC 中的 AJAXHelper 类的扩展方法。
以下是 AJAX 帮助器中的选项
- Url:这是请求 URL。
- Confirm:用于指定要在确认框中显示的消息。
- OnBegin:此处给出 Javascript 方法名称,将在 AJAX 请求之前调用。
- OnComplete:此处给出 Javascript 方法名称,将在 AJAX 请求结束时调用。
- OnSuccess - 此处给出 Javascript 方法名称,将在 AJAX 请求成功时调用。
- OnFailure - 此处给出 Javascript 方法名称,将在 AJAX 请求失败时调用。
- UpdateTargetId:从返回 HTML 的操作填充的目标元素。
布局页面类似于传统 Web 窗体中的主页面。它用于在多个页面中设置通用外观。在每个子页面中,我们可以找到:/p>
@{ Layout = "~/Views/Shared/TestLayout1.cshtml"; }这表示子页面使用 TestLayout 页面作为其主页面。
节是要在布局页面中呈现的 HTML 部分。在布局页面中,我们将使用以下语法来呈现 HTML
@RenderSection("TestSection")在子页面中,我们定义这些节,如下所示
@section TestSection{ <h1>Test Content<h1> }如果任何子页面没有定义此节,则会抛出错误,因此为了避免这种情况,我们可以这样呈现 HTML
@RenderSection("TestSection", required: false)
RenderBody 就像 Web 窗体中的 ContentPlaceHolder。它将存在于布局页面中,并将呈现子页面/视图。布局页面将只有一个 RenderBody() 方法。RenderPage 也存在于布局页面中,布局页面中可以有多个 RenderPage()。
此页面用于确保为多个视图使用通用布局页面。加载应用程序时,将首先执行此文件中编写的代码。
以下是用于从操作呈现视图的方法:
- View():从操作返回视图。
- PartialView():从操作返回部分视图。
- RedirectToAction():重定向到不同的操作,该操作可以在同一个控制器中或不同的控制器中。
- Redirect():类似于 webforms 中的“Response.Redirect()”,用于重定向到指定的 URL。
- RedirectToRoute():从指定的 URL 重定向到操作,但已匹配路由表中的 URL。
ActionResult 用于表示操作方法的结果。以下是 ActionResult 的子类型
- ViewResult
- PartialViewResult
- RedirectToRouteResult
- RedirectResult
- JavascriptResult
- JSONResult
- FileResult
- HTTPStatusCodeResult
在 ASP.Net MVC 中,所有公共方法都被视为 Action。因此,如果您正在创建方法,并且不想将其用作 Action 方法,则必须使用“NonAction”特性进行修饰,如下所示
[NonAction] public void TestMethod() { // Method logic }
“ActionName”特性可用于更改 Action 名称。下面是演示更多内容的示例代码片段
[ActionName("TestActionNew")] public ActionResult TestAction() { return View(); }因此,在上面的代码片段中,“TestAction”是原始的 Action 名称,在“ActionName”特性中,给出了名称“TestActionNew”。因此,此 Action 方法的调用者将使用名称“TestActionNew”来调用此 Action。
与计算并发送到响应的代码表达式不同,它是执行的代码块。这对于声明以后可能需要使用的变量很有用。
@{ int x = 123; string y = "aa"; }
HelperPage.IsAjax 属性获取一个值,该值指示在 Web 页面请求期间是否正在使用 Ajax。
创建 JavaScript 方法
function DrpIndexChanged() { }调用方法
< %:Html.DropDownListFor(x => x.SelectedProduct, new SelectList(Model.Customers, "Value", "Text"), "Please Select a Customer", new { id = "ddlCustomers", onchange=" DrpIndexChanged ()" })%>
数据特性是可以在“System.ComponentModel.DataAnnotations”命名空间中找到的特性。这些特性将用于服务器端验证,并且也支持客户端验证。四个特性 - Required、StringLength、RegularExpression 和 Range 用于涵盖常见的验证场景。
此方法用于将指定的局部视图呈现为 HTML 字符串。此方法不依赖于任何 Action 方法。我们可以像下面这样使用它:@Html.Partial("TestPartialView")
方法的结果:“RenderPartial”直接写入 HTML 响应。此方法不返回任何内容(void)。此方法也不依赖于 Action 方法。RenderPartial() 方法在内部调用“Write()”,我们必须确保“RenderPartial”方法包含在括号中。下面是示例代码片段:@ {Html.RenderPartial("TestPartialView");}
“RouteConfig.cs”保存 ASP.Net MVC 的路由配置。RouteConfig 将在 Global.asax 中注册的 Application_Start 事件上初始化。
ASP.NET ASP.Net MVC 中的脚手架用于生成控制器、模型和视图,以在应用程序中创建、读取、更新和删除 (CRUD) 功能。脚手架将了解用于模型、控制器和视图的命名约定。
以下是脚手架的类型
- 空
- 创建
- 删除
- 详细信息
- 编辑
- 列表
是的,我们可以跨多个控制器共享视图。我们可以将视图放在“Shared”文件夹中。当我们创建一个新的 ASP.Net MVC 项目时,我们可以看到布局页面将添加到共享文件夹中,这是因为它被多个子页面使用。
- 名称 - 这是路由的名称。
- URL 模式:将提供占位符以匹配请求 URL 模式。
- 默认值:加载应用程序时,要加载哪个控制器、Action以及参数。
使用此默认路由 - {resource}.axd/{*pathInfo},我们可以防止对 Web 资源文件(例如 WebResource.axd 或 ScriptResource.axd)的请求传递到控制器。
是的,我们可以通过以下方式在路由中添加约束
- 使用正则表达式
- 使用实现接口 IRouteConstraint 的对象。
以下是 Razor 视图可以具有的两种扩展名
- .cshtml:在 C# 编程语言中将使用此扩展名。
- .vbhtml - 在 VB 编程语言中将使用此扩展名。
PartialView 类似于传统 Web 窗体中的用户控件。出于可重用性目的,使用部分视图。由于它已与多个视图共享,因此它们保存在共享文件夹中。部分视图可以通过以下方式呈现
- Html.Partial()
- Html.RenderPartial()
以下是将 css 添加到 Razor 视图的示例代码片段:< link rel="StyleSheet" href="/@Href(~Content/Site.css")" type="text/css"/>
不可以。我们无法在 Visual Studio Express 版本中添加测试用例,它只能在 Visual Studio 的专业版和旗舰版中添加。
Glimpse 是一个用于调试 ASP.Net MVC 中路由的开源工具。它是客户端调试器。必须通过访问本地 URL 链接来打开 Glimpse - https://127.0.0.1:portname//glimpse.axd 这是一个流行且有用的调试工具,它跟踪速度详细信息、URL 详细信息等。
动作过滤器允许我们在 Action 执行之前或之后执行代码。这可以通过使用 ASP.Net MVC 特性修饰控制器的 Action 方法来完成。
以下是使用的一些 Action 过滤器
- 身份验证
- 授权
- HandleError
- OutputCache
可以通过以下方式完成:使用类:“HttpRequestBase”并使用方法:“HttpMethod”来确定 Action 请求类型。
每当验证失败时,它都会在 ModelState 中跟踪。通过使用属性:IsValid 可以确定。在服务器代码中,这样检查
if(ModelState.IsValid){ // No Validation Errors }
在 Web.Config 中,有一些名为“ClientValidationEnabled”和“UnobtrusiveJavaScriptEnabled”的标记。我们可以通过将这两个标记设置为“true”来设置客户端验证,然后此设置将应用于应用程序级别。
< add key="ClientValidationEnabled" value="true" /> < add key="UnobtrusiveJavaScriptEnabled" value="true" />
对于模型绑定,我们将使用名为“ModelBinders”的类,它允许访问应用程序中的所有模型绑定器。我们可以通过继承“IModelBinder”来创建自定义模型绑定器。
ASP.Net MVC 中的异常处理变得很简单,只需重写“OnException”并将 filtercontext 对象的结果属性(如下所示)设置为要返回的视图详细信息即可,以防出现异常。
protected overrides void OnException(ExceptionContext filterContext) { }
如果在当前请求中分配了 Tempdata,则它将对当前请求和后续请求可用,并且取决于是否读取了 TempData 中的数据。如果读取了 Tempdata 中的数据,则它将无法用于后续请求。
如上所述,如果 Tempdata 中的数据仅在当前请求中读取,则使用“Keep”方法使其对后续请求可用。
@TempData["TestData"]; TempData.Keep("TestData");
与 Keep 方法类似,我们还有另一个名为“Peek”的方法用于相同目的。此方法用于读取 Tempdata 中的数据,并将其保留以供后续请求使用。
string A4str = TempData.Peek("TT").ToString();
区域用于存储项目模块的详细信息。这对于大型应用程序非常有用,在大型应用程序中,控制器、视图和模型都位于主控制器、视图和模型文件夹中,并且很难管理。
当我们创建了一个区域时,请确保它在 Global.asax 中的“Application_Start”事件中注册。以下是执行区域注册的代码片段
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); }
为了创建可重用的窗口小部件,使用子 Action,它将嵌入到父视图中。在 ASP.Net MVC 中,部分视图用于在应用程序中实现可重用性。子 Action 主要返回部分视图。
“ChildActionOnly”特性修饰 Action 方法以指示该 Action 方法是子 Action。以下是用于表示子 Action 的代码片段
[ChildActionOnly] public ActionResult MenuBar() { //Logic here return PartialView(); }
它是一种设计模式,用于开发松耦合代码。这在软件项目中得到了广泛的应用。这将减少在项目设计发生变化时所需的编码工作,因此得到了广泛的应用。
以下是 DI 的优点
- 减少类耦合
- 提高代码重用
- 提高代码可维护性
- 改进应用程序测试
TDD 是一种方法论,它说,在编写代码之前先编写测试。在 TDD 中,测试驱动应用程序设计和开发周期。在所有单元测试通过之前,您不会将代码签入源代码管理。
以下是用于单元测试的工具
- NUnit
- xUnit.NET
- Ninject 2
- Moq
REST 是一种架构风格,它使用 HTTP 协议方法(如 GET、POST、PUT 和 DELETE)来访问数据。ASP.Net MVC 以这种方式工作。在 ASP.Net MVC 4 中,支持 Web API,它用于使用 HTTP 动词构建服务。
我们可以在 ASP.Net MVC 中使用数据特性进行验证。如果我们想在运行时使用 Jquery 进行验证,那么我们可以使用 Jquery 插件进行验证。例如:如果要对客户姓名文本框进行验证,则可以执行以下操作
$('#CustomerName').rules("add", { required: true, minlength: 2, messages: { required: "Please enter name", minlength: "Minimum length is 2" } });
以下是解决多个提交按钮问题的场景和解决方案。场景
@using (Html.BeginForm("MyTestAction","MyTestController") { <input type="submit" value="MySave" /> <input type="submit" value="MyEdit" /> }解决方案
Public ActionResult MyTestAction(string submit) //submit will have value either "MySave" or "MyEdit" { // Write code here }
- 显示模板:这些是模型中心的。这意味着它取决于所使用的视图模型的属性。它使用约定,该约定仅显示 div 或标签。
- 编辑模板:这些也是模型中心的,但将具有可编辑的控件,如文本框。
- 部分视图:这些是视图中心的。它们在呈现属性 (Id) 的方式上与模板不同。例如:CategoryViewModel 具有 Product 类属性,则它将呈现为 Model.Product.ProductName,但在模板的情况下,如果 CategoryViewModel 具有 List
然后 @Html.DisplayFor(m => m.Products) 工作,它为该列表的每个项目呈现模板。
不可以。我们不能为属性 maxJsonLength 设置无限长度。默认值为 - 102400,我们可以设置的最大值为:2147483644。
可以。我们可以在 cshtml 中使用 <text> 元素在 javascript 中使用 Razor 代码。
< script type="text/javascript"> @foreach (var item in Model) { < text > //javascript goes here which uses the server values < text > } < script>
以下是从 Action 方法返回字符串的代码片段
public ActionResult TestAction() { return Content("Hello Test !!"); }
以下是从 Action 方法返回字符串的代码片段
public ActionResult TestAction() { return JSON(new { prop1 = "Test1", prop2 = "Test2" }); }
下一步是什么?
此外,你可以回顾一下你之前做过与该主题相关的作业,并确保你能自信地谈论它们。如果你是应届毕业生,面试官不会期望你回答非常复杂的问题,而是希望你的基础概念非常扎实。
其次,如果你无法回答一些问题,其实并不太重要,重要的是,你回答的任何问题,都必须充满自信。所以在面试过程中要保持自信。Tutorialspoint祝你面试顺利,并祝你在未来的工作中一切顺利。干杯:-)