应聘.Net MVC 职位面试问题概括(续)

  • A+
所属分类:C#.NET 编程技术

在MVC中如何用表单认证?

表单认证和ASP.NET的表单验证一样。第一步是设置认证模式为Forms。loginUrl是指向到controller,而不是一个页面。

<authentication mode="Forms">
<forms loginUrl="~/Home/Login"  timeout="2880"/>
</authentication>

我们也需要创建一个controller,去验证用户。如果验证通过,需要设置cookies值。

public ActionResult Login()
{
    if ((Request.Form["txtUserName"] == "Shiv") && 
          (Request.Form["txtPassword"] == "Shiv@123"))
    {
        FormsAuthentication.SetAuthCookie("Shiv",true);
        return View("About");
    }
    else
    {
        return View("Index");
    }
}

其它需要验证的action都需要加一个 Authorize 属性,如果用户没权限将转向到登陆页面。

[Authorize]
PublicActionResult Default()
{
return View();
}
[Authorize]
publicActionResult About()
{
return View();
}

在MVC中如何执行AJAX?

MVC中有两种方式可以执行AJAX:

  • AJAX libraries
  • jQuery

下面是一个简单的实例,它使用“AJAX”帮助执行AJAX。在下面的代码中,你可以使用Ajax.BeginForm创建了一个表单。这个表单调用了一个getCustomer方法。

<script language="javascript">
function OnSuccess(data1) 
{
// Do something here
}
</script>
<div>
<%
        var AjaxOpt = new AjaxOptions{OnSuccess="OnSuccess"};        
    %>
<% using (Ajax.BeginForm("getCustomer","MyAjax",AjaxOpt)) { %>
<input id="txtCustomerCode" type="text" /><br />
<input id="txtCustomerName" type="text" /><br />
<input id="Submit2" type="submit" value="submit"/></div>
<%} %>

如果你想做在hyperlink点击上做Ajax调用,你可以使用 Ajax.ActionLink 函数,如下图所示。

应聘.Net MVC 职位面试问题概括(续)

图示: 在MVC中执行AJAX

如果你想创建一个AJAX异步hyperlink,它调用controller中的GetDate方法,代码如下。一旦controller作出回应,这个数据会显示在id为DateDiv的DIV中。

<span id="DateDiv" />
<%: 
Ajax.ActionLink("Get Date","GetDate",
new AjaxOptions {UpdateTargetId = "DateDiv" })
%>

下面是Controller代码。你可以看到GetDate有延迟10秒。

public class Default1Controller : Controller
{
   public string GetDate()
   {
       Thread.Sleep(10000);
       return DateTime.Now.ToString();
   }
}

在MVC中做Ajax调用的第二种方式是使用jQuery。下面的代码你可以看到我们做了一个AJAX POST到 /MyAjax/getCustomer。 它 使用$.post。所有的逻辑代码放在GetData函数中,你可以通过一个按钮或者是链接点击事件去调用它。

function GetData() 
{
    var url = "/MyAjax/getCustomer";
    $.post(url, function (data) 
    {
        $("#txtCustomerCode").val(data.CustomerCode);
        $("#txtCustomerName").val(data.CustomerName);
    }
    )
}

在AJAX中有几种事件可以跟踪?

应聘.Net MVC 职位面试问题概括(续)

图示: AJAX中的事件跟踪

ActionResult 和 ViewResult有什么不同?

  • ActionResult  是一个抽象类,ViewResult衍生于  ActionResult  类。  ActionResult 有几种衍生类,例如:  ViewResultJsonResult FileStreamResult , 等等。
  • ActionResult  可以用来开发多态和动态动象。所以如果你动态运行不同类型的视图, ActionResult  是最好的选择。例如下面的代码,你可以看见我们有一个 DynamicView 。基于标记(IsHtmlView),它会返回 ViewResult  或  JsonResult
    public ActionResult DynamicView()
    {
       if (IsHtmlView)
         return View(); // returns simple ViewResult
       else
         return Json(); // returns JsonResult view
    }

MVC有多少种不同类型的结果类型?

注意: 很难去记住所有的12种类型。但是一些重要的你可以记住,例如: ActionResult ,  ViewResult ,和  JsonResult 。详情如下:

MVC中的12种结果类型,最主要的是ActionResult类,它是一个基础类,它有11个子类型,如下:

  1. ViewResult  - 给响应流渲染指定的视图
  2. PartialViewResult  - 给响应流渲染指定的局部视图
  3. EmptyResult  - 返回空的响应结果。
  4. RedirectResult  - 执行一个HTTP转向到指定的URL。
  5. RedirectToRouteResult  - 执行一个HTTP转向到一个URL,这个URL由基于路由数据的路由引擎来决定
  6. JsonResult  - 序列化一个ViewData对像到JSON格式。
  7. JavaScriptResult  - 返回一段Javascript代码,它可以在客户端执行。
  8. ContentResult  - 写内容到响应流,不需要视图支持。
  9. FileContentResult  - 返回一个文件到客户端。
  10. FileStreamResult  - 返回一个文件到客户端,它提供的是流。
  11. FilePathResult  - 返回一个文件到客户端。

MVC中的ActionFilters是什么?

ActionFilters帮助你在MVC action执行中或执行后,执行一些逻辑。

应聘.Net MVC 职位面试问题概括(续)

图示: MVC中的ActionFilters。

Action filters通常用在下面的场景中:

  1. 在action发生前,执行POST logic before the action happens.
  2. 取消一个当前的执行。
  3. 检查返回值。
  4. 给action提供特殊的数据。

你有两种方式创建action filters:

  • 内联action filter.
  • 创建一个  ActionFilter  属性.

创建内联action filter,我们需要执行 IActionFilter 接口。 IActionFilter 接口有两个方法:  OnActionExecuted  和  OnActionExecuting 。在这两个方法中我们可以执行预处理逻辑或取消逻辑。

public class Default1Controller : Controller , IActionFilter
{
    public ActionResult Index(Customer obj)
    {
        return View(obj);
    }
    void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
    {
        Trace.WriteLine("Action Executed");
    }
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {
        Trace.WriteLine("Action is executing");
    }
}

内联Action filter的问题是不能跨Controler。我们可以转换内联action filter到action filter属性。创建action filter属性,我们需要继承 ActionFilterAttribute 和执行 IActionFilter  接口,代码如下:

public class MyActionAttribute : ActionFilterAttribute , IActionFilter
{
    void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
    {
        Trace.WriteLine("Action Executed");
    }
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {
      Trace.WriteLine("Action executing");
    }
}

之后我们可以在controller上使用这个属性。你可以看下面的代码:

[MyActionAttribute]
public class Default1Controller : Controller 
{
    public ActionResult Index(Customer obj)
    {
        return View(obj);
    }
}

MVC中可以创建自定义视图引擎吗?

可以,在MVC中我们可以创建自己的自定义视图引擎。创建自己的自定义视图引擎需要跟随下面三步:

我们将创建一个自定义视图引擎,在视图里用户可以输入一个命令,比如“<DateTime>”,它会显示当前的日期和时间。

步骤1 :我们需要创建一个类去执行IView接口。我们应该 在这个类的render函数中写一些逻辑,指明如何渲染视图。示例代码如下:

public class MyCustomView : IView
{
    private string _FolderPath; // Define where  our views are stored
    public string FolderPath
    {
        get { return _FolderPath; }
        set { _FolderPath = value; }
    }

    public void Render(ViewContext viewContext, System.IO.TextWriter writer)
    {
       // Parsing logic <dateTime>
        // read the view file
        string strFileData = File.ReadAllText(_FolderPath);
        // we need to and replace <datetime> datetime.now value
        string strFinal = strFileData.Replace("<DateTime>", DateTime.Now.ToString());
        // this replaced data has to sent for display
        writer.Write(strFinal); 
    }
}

步聚2: 我们需要创建一个类,它继承 VirtualPathProviderViewEngine ,并且我们需要提供一个文件夹路径和视图文件扩展名。例如,Razor是“cshtml”,aspx是“.aspx”。示例代码如下:

public class MyViewEngineProvider : VirtualPathProviderViewEngine
{
    // We will create the object of Mycustome view
    public MyViewEngineProvider() // constructor
    {
        // Define the location of the View file
        this.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.myview", 
          "~/Views/Shared/{0}.myview" }; //location and extension of our views
    }
    protected override IView CreateView(
      ControllerContext controllerContext, string viewPath, string masterPath)
    {
        var physicalpath = controllerContext.HttpContext.Server.MapPath(viewPath);
        MyCustomView obj = new MyCustomView(); // Custom view engine class
        obj.FolderPath = physicalpath; // set the path where the views will be stored
        return obj; // returned this view paresing
        // logic so that it can be registered in the view engine collection
    }
    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
    {
        var physicalpath = controllerContext.HttpContext.Server.MapPath(partialPath);
        MyCustomView obj = new MyCustomView(); // Custom view engine class
        obj.FolderPath = physicalpath; // set the path where the views will be stored
        return obj;
        // returned this view paresing logic
        // so that it can be registered in the view engine collection
    }
}

步骤 3: 我们需要注册自定义视图到视图集合。注册自定义视图引擎最适合的地方是global.aspx文件中的 ViewEngines 集合。 代码如下:

protected void Application_Start()
{
    // Step3 :-  register this object in the view engine collection
    ViewEngines.Engines.Add(new MyViewEngineProvider());
    …..
}

下面是一个实例,在自定义视图的顶部中写了一个定义好的命令。

应聘.Net MVC 职位面试问题概括(续)

图示: MVC中的自定义视图引擎

当你调用视图,你应该能看见下面的输出:

应聘.Net MVC 职位面试问题概括(续)

 

在MVC中如何返回JSON格式的结果?

在MVC中,我们有 JsonResult 类可以返回JSON格式数据。下面是一个简单的例子,它使用JsonResult返回Customer对象的JSON格式。

public JsonResult getCustomer()
{
    Customer obj = new Customer();
    obj.CustomerCode = "1001";
    obj.CustomerName = "Shiv";
    return Json(obj,JsonRequestBehavior.AllowGet);
}

下面是上面代码的JSON输出:

应聘.Net MVC 职位面试问题概括(续)

 

什么是WebAPI?

HTTP是最常用的协议。过去的很多年,浏览器是我们使用HTTP方式公开数据的首选客户端。但是日新月异,客户端发展到多种形式。我们需要使用HTTP方式传递数据给不同的客户端,例如:移动手机、Javascript,Windows应用等等。

WebAPI是一个通过HTTP方式公开数据的技术,它跟随REST规则。

WCF SOAP 也做同样的事情,它与WebAPI也有什么区别?

SOAP WEB API
大小 重量级,因为它使用复杂的WSDL结构。 轻量级,只有需要的信息被传递。
协议 协议无关 只支持HTTP协议
格式 解析SOAP信息,客户端需要理解WSDL格式。写自定义代码去解析WSDL是非常重要的任务。如果客户端足够聪明去创建一个代理对象,比如在.net中添加引用,那么SOAP是最简单的方式。 WebAPI的输出是简单的字符串、JSON、简单XML格式等。所以,写解析逻辑非常简单。
规则 SOAP跟随WS-* 规定 WebAPI跟随REST规定。(Please refer to REST in WCF chapter.)

关于Web API, 你可以看我的另一篇翻译:ASP.NET Web API详解

在MVC中我们如何识别是PSOT还是GET调用?

在控制器中识别POST或GET,我们可以使用 Request.HttpMethod ,代码如下所示:

public ActionResult SomeAction()
{
    if (Request.HttpMethod == "POST")
    {
        return View("SomePage");
    }
    else
    {
        return View("SomeOtherPage");
    }
}

什么是MVC中的打包也压缩?

打包与压缩帮助我们减少一个页面的请求时间,从而提高页面执行性能。

打包如何搞高性能?

我们的项目总是需要CSS和脚本文件。打包帮助你合并多个Javascript和css文件到单个文件,从而最小化多个请求到一个请求。

例如,包含下面的web请求到一个页。这个页面要求两个Javascript文件, Javascript1.js 和 Javascript2.js 。 当请求这个页面时,它要做三次请求:

  • 一个是Index页面.
  • 两个请求是为了两个JavaScript文件: Javascript1.js  和 Javascript2.js .

如果页面中有大量的javascript文件,这样会降低性能。如果我们可以合并所有的JS文件到一个文件,只请求一个,这将加增加性能。如下图所示:

应聘.Net MVC 职位面试问题概括(续) 应聘.Net MVC 职位面试问题概括(续)

MVC中如何执行打包?

打开 App_Start 文件夹中的 BundleConfig.cs

应聘.Net MVC 职位面试问题概括(续)

在 BundleConfig.cs 中,添加你想打包的JS文件路径到打包集合。如下所示:

bundles.Add(new ScriptBundle("~/Scripts/MyScripts").Include(
"~/Scripts/*.js"));

下面是 BundleConfig.cs 文件的代码:

public  class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.Add(new ScriptBundle("~/Scripts/MyScripts").Include(
           "~/Scripts/*.js"));
        BundleTable.EnableOptimizations = true;
    }
}

一旦你合并了脚本到一个文件,你可以使用下面的代码去调用它:

<%= Scripts.Render("~/Scripts/MyScripts")  %>

你将看到脚本请求被合并到一个:

应聘.Net MVC 职位面试问题概括(续)

 

在debug模式下如何测试打包功能?

如果你在debug模式下,你需要在bundleconfig.cs中设置 EnableOptimizations 为true,否则你不会看到打包效果。

BundleTable.EnableOptimizations = true;

解释压缩,它是如何执行的?

压缩功能通过移除空格、注释等减少了脚本与CSS文件的大小。例如下面的代码:

// This is test
var x = 0;
x = x + 1;
x = x * 2;

执行压缩后的Javascript代码如下所示。

var x=0;x=x+1;x=x*2;
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: