ASP.NET MVC 问题与答案

ASP.Net MVC 是一种模式,用于将应用程序的实现逻辑分为三个组件,即模型、视图和控制器。

模型:它基本上是一个用于表示应用程序数据的业务实体。 控制器:用户发送的请求总是通过控制器分散,它的责任是使用 View() 方法重定向到特定视图。 视图:它是 ASP.Net MVC 的表示层。

以下是新添加的功能: 移动模板 添加了用于创建基于 REST 的服务的 ASP.NET Web API 模板。 异步控制器任务支持。 捆绑 Java 脚本。 分离 ASP.Net MVC 路由、Web API、Bundle 等的配置。

以下是按顺序进行的处理 -

  • 应用程序初始化 ASP.NET 中的关注点分离是什么 ASP.Net MVCation
  • 路由
  • 实例化并执行控制器
  • 定位并调用控制器操作
  • 实例化并呈现视图。

  • 在 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 代码。 例如:非侵入式 JavaScript 不使用 onclick 和 onsubmit 等事件,而是根据 HTML5 数据属性通过元素的 ID 或类附加到元素。

View Model 是一个具有属性的普通类,用于将其绑定到强类型视图。View Model 可以使用数据注释为其属性定义验证规则。

路由是将传入请求与路由表中注册的 URL 模式进行模式匹配的机制。类:"UrlRoutingModule"用于相同的过程。

操作是 Controller 类中的方法,负责返回视图或 json 数据。操作主要具有返回类型:"ActionResult",它将从控制器调用的方法:"InvokeAction()"调用。

ASP.NET Web API 支持这种类型的路由。这是在 ASP.Net MVC5 中引入的。在这种类型的路由中,使用属性来定义路由。这种类型的路由比传统的 URI 路由具有更多的控制权。属性路由可以在控制器级别或操作级别定义,例如:

[Route("{action = TestCategoryList}")] - 控制器级别
[Route("customers/{TestCategoryId:int:min(10)}")] - 操作级别

只需添加 @Model.CustomerName 方法:"MapASP.Net MVCAttributeRoutes()"即可启用属性路由,如下所示:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        //启用属性路由
        routes.MapASP.Net MVCAttributeRoutes();
        //基于约定的路由
        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 版中引入的 dynamic 关键字。但在使用 ViewBag 之前,我们必须记住 ViewBag 比 ViewData 慢。

TempData 再次是与 ViewData 相同的键值对。它派生自"TempDataDictionary"类。当要在两个连续的请求中使用数据时,将使用 TempData,这可以在操作之间或控制器之间。这需要在视图中进行类型转换。

HTML 帮助程序类似于传统 Web 表单中的控件。但与 Web 控件相比,HTML 帮助程序更轻量,因为它不包含视图状态和事件。 HTML 帮助程序返回可直接呈现到 HTML 页面的 HTML 字符串。还可以通过覆盖"HtmlHelper"类来创建自定义 HTML 帮助程序。

AJAX 帮助程序用于创建启用 AJAX 的元素,例如启用 Ajax 的表单和链接,它们异步执行请求,这些是 AJAXHelper 类的扩展方法,存在于命名空间 - System.Web.ASP.Net MVC 中。

以下是 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() : 类似于 Web 表单中的"Response.Redirect()",用于重定向到指定的 URL。
  • RedirectToRoute() : 从指定的 URL 重定向到操作,但路由表中的 URL 已匹配。

ActionResult 用于表示操作方法结果。以下是 ActionResult 的子类型:

  • ViewResult
  • PartialViewResult
  • RedirectToRouteResult
  • RedirectResult
  • JavascriptResult
  • JSONResult
  • FileResult
  • HTTPStatusCodeResult

在 ASP.Net MVC 中,所有公共方法都被视为操作。因此,如果您正在创建一种方法,并且不想将其用作操作方法,则必须使用"NonAction"属性修饰该方法,如下所示:

[NonAction]
public void TestMethod()
{
    // 方法逻辑
}

"ActionName"属性可用于更改操作名称。以下是示例代码片段,用于演示更多内容:

[ActionName("TestActionNew")]
public ActionResult TestAction()
    {
        return View();
    }
因此,在上面的代码片段中,"TestAction"是原始操作名称,而在"ActionName"属性中,给出了名称"TestActionNew"。因此,此操作方法的调用者将使用名称"TestActionNew"来调用此操作。

与评估并发送到响应的代码表达式不同,执行的是代码块。这对于声明我们以后可能需要使用的变量很有用。

@{
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"命名空间中找到的属性。这些属性将用于服务器端验证,并且还支持客户端验证。四个属性 - 必需、字符串长度、正则表达式和范围用于涵盖常见的验证场景。

此方法用于将指定的部分视图呈现为 HTML 字符串。此方法不依赖于任何操作方法。我们可以像下面这样使用它: @Html.Partial("TestPartialView")

该方法的结果:"RenderPartial"直接写入 HTML 响应。此方法不返回任何内容(void)。此方法也不依赖于操作方法。RenderPartial() 方法在内部调用"Write()",我们必须确保"RenderPartial"方法括在括号中。以下是示例代码片段: @{Html.RenderPartial("TestPartialView"); }

"RouteConfig.cs" 保存 ASP.Net MVC 的路由配置。RouteConfig 将在 Global.asax 中注册的 Application_Start 事件上初始化。

ASP.NET 中的 Scaffolding ASP.Net MVC 用于生成控制器、模型和视图,以便在应用程序中创建、读取、更新和删除 (CRUD) 功能。Scaffolding 将了解用于模型、控制器和视图的命名约定。

以下是脚手架的类型:

  • Empty
  • Create
  • Delete
  • Details
  • Edit
  • List

是的,我们可以在多个控制器之间共享一个视图。我们可以将视图放在"Shared"文件夹中。当我们创建一个新的 ASP.Net MVC 项目时,我们可以看到布局页面将被添加到共享文件夹中,这是因为它被多个子页面使用。

  • 名称 - 这是路由的名称。
  • URL 模式:将提供占位符以匹配请求 URL 模式。
  • 默认值:加载应用程序时,要加载哪个控制器、操作以及参数。

使用此默认路由 - {resource}.axd/{*pathInfo},我们可以阻止对 WebResource.axd 或 ScriptResource.axd 等 Web 资源文件的请求传递到控制器。

是的,我们可以通过以下方式向路由添加约束:

  • 使用正则表达式
  • 使用实现接口的对象 - IRouteConstraint。

以下是 Razor 视图可以具有的两种扩展类型:

  • .cshtml:在 C# 编程语言中将使用此扩展。
  • .vbhtml - 在 VB 编程语言中将使用此扩展。

PartialView 类似于传统 Web 表单中的 UserControls。为了实现可重用性,使用了部分视图。由于它已与多个视图共享,因此这些视图保存在共享文件夹中。部分视图可以通过以下方式呈现:

  • Html.Partial()
  • Html.RenderPartial()

Below is the sample code snippet to add css to razor views : < link rel="StyleSheet" href="/@Href(~Content/Site.css")" type="text/css"/>

不可以。我们无法在 Visual Studio Express 版本中添加测试用例,只能在 Visual Studio Professional 和 Ultimate 版本中添加。

Glimpse 是一个用于调试 ASP.Net MVC 中的路由的开源工具。它是客户端调试器。必须通过访问本地 URL 链接来打开 Glimpse - http://localhost:portname//glimpse.axd 这是一个流行且有用的调试工具,可跟踪速度详细信息、URL 详细信息等。

Action Filters 允许我们在执行操作之前或之后执行代码。这可以通过使用 ASP.Net MVC 属性装饰控件的操作方法来实现。

以下是一些使用的操作过滤器:

  • Authentication
  • Authorization
  • HandleError
  • OutputCache

可以通过以下方式完成: 使用类:"HttpRequestBase"并使用方法:"HttpMethod"来确定操作请求类型。

每当验证失败时,都会在 ModelState 中对其进行跟踪。通过使用属性:IsValid 可以确定。在服务器代码中,像这样检查:

if(ModelState.IsValid){
    // 无验证错误
}

在 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();

Area 用于存储我们项目模块的详细信息。这对于大型应用程序非常有用,因为控制器、视图和模型都在主控制器、视图和模型文件夹中,管理起来非常困难。

创建区域后,请确保在 Global.asax 中的"Application_Start"事件中注册该区域。以下是完成区域注册的代码片段:

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
}

要创建可重用的小部件,请使用子操作,这些操作将嵌入到父视图中。在 ASP.Net MVC 中,部分视图用于在应用程序中实现可重用性。子操作主要返回部分视图。

"ChildActionOnly"属性在操作方法上进行修饰,以指示该操作方法是子操作。以下是用于表示子操作的代码片段:

[ChildActionOnly]
public ActionResult MenuBar()
{
//此处为逻辑
return PartialView();
}

它是一种设计模式,用于开发松散耦合代码。这在软件项目中得到了广泛的应用。如果项目设计发生变化,这将减少编码,因此被广泛使用。

以下是 DI 的优势:

  • Reduces class coupling
  • Increases code reusing
  • Improves code maintainability
  • Improves application testing

TDD 是一种方法论,即在编写代码之前先编写测试。在 TDD 中,测试驱动您的应用程序设计和开发周期。在所有单元测试通过之前,您不会将代码签入源代码控制。

以下是用于单元测试的工具:

  • NUnit
  • xUnit.NET
  • Ninject 2
  • Moq

REST 是一种架构风格,它使用 HTTP 协议方法(如 GET、POST、PUT 和 DELETE)来访问数据。ASP.Net MVC 以这种风格工作。在 ASP.Net MVC 4 中,支持使用 HTTP 动词构建服务的 Web API。

我们可以在 ASP.Net MVC 中使用数据注释进行验证。如果我们想在运行时使用 Jquery 进行验证,那么我们可以使用 Jquery 插件进行验证。 例如:如果要在客户姓名文本框上进行验证,那么我们可以这样做:

$('#CustomerName').rules("add", {
required: true,
minlength: 2,
messages: {
required: "Please enter name",
minlength: "Minimum length is 2"
}
});

以下是解决多个提交按钮问题的场景和解决方案。 Scenario :

@using (Html.BeginForm("MyTestAction","MyTestController")
{
    <input type="submit" value="MySave" />
    <input type="submit" value="MyEdit" />
}
Solution :
Public ActionResult MyTestAction(string submit) //submit 的值要么是"MySave",要么是"MyEdit"
{
    // 在此处写入代码
}

  • 显示模板:这些是以模型为中心的。这意味着它取决于所用视图模型的属性。它使用仅显示 div 或标签的约定。
  • 编辑模板:这些也是以模型为中心的,但将具有可编辑控件,如文本框。
  • 部分视图:这些是以视图为中心的。这些将与模板的不同之处在于它们呈现属性(Id)的方式。例如:CategoryViewModel 具有 Product 类属性,那么它将被呈现为 Model.Product.ProductName,但在模板的情况下,如果我们的 CategoryViewModel 具有 List,那么 @Html.DisplayFor(m => m.Products) 就会起作用,它会为该列表的每个项目呈现模板。

不可以。我们不能为属性 maxJsonLength 设置无限长度。默认值为 - 102400,我们可以设置的最大值为:2147483644。

可以。我们可以通过使用 <text> 元素在 cshtml 中的 javascript 中使用 razor 代码。

< script type="text/javascript">
@foreach (var item in Model) {
< text >
//javascript 在此处使用服务器值
< text >
}
< script>

以下是从操作方法返回字符串的代码片段:

public ActionResult TestAction() {
return Content("Hello Test !!");
}

以下是从操作方法返回字符串的代码片段:

public ActionResult TestAction() {
return JSON(new { prop1 = "Test1", prop2 = "Test2" });
}

mvc_framework_interview_questions.html