当我们想渲染视图时,幕后发生了什么?

时间:2015-10-30 12:15:28

标签: c# asp.net-mvc

ActionResult是MVC中各种返回类型的基类。因此,您的操作必须返回ActionResult或从其派生的类才能工作。

所以我们可以使用

ToArray()

或者例如

public ContentResult Index()
{
    return Content("Hello world");
}

或ActionResult

public ViewResult Index()
{
    return View();
}

但也可以使用字符串!!!

public ActionResult Index()
{
    if (ViewBag.Hello = "World")
        return Json("");
    return PartialView();
}

为什么不可能返回整数来查看? (或者也许是?)

public string Index()
{
    return "Hello World";
}

并且不可能返回某个实体来查看(或者可能是?)

public int Index()
{
    return 4;
}

我的问题是:当我们想渲染视图时,幕后发生了什么?

1 个答案:

答案 0 :(得分:2)

我同意这是一个相当广泛的问题,但我想提出一些问题并回答你在问题中提出的一些观点。

您可以从操作方法返回intstringobject,它只会返回对象的字符串表示形式。

因此,您不必返回类型为ActionResult的对象才能使其工作,但ActionResult通过各种实现启用了有用的功能,以便ASP.NET MVC Framework可以处理开箱即用的不同场景。

例如返回视图和处理要传递给视图的ViewModel:

return View(); // Default view without view model
return View(viewModelObject); // Default view with a view model

根据您的路由信息​​返回视图:

return View("viewName", viewModelObject);

使用路由信息执行重定向到其他页面:

return RedirectToAction(actionName, controllerName);

返回包含特定状态代码的页面:

return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

返回JSON而不是视图:

return JsonResult(myObject);

以上所有示例都做了不同的事情,返回不同类型的结果并为您处理对象,这样您就不必自己编写行为 - 它们已准备好供您使用。

另一个方便的事情是,您可以创建自己的ActionResult实现来创建自己的行为,因此在这方面它非常灵活。

我同意@Daniel J.G.您应该更多地阅读有关ASP.NET MVC如何挂起的内容,并且对您来说将变得更加清晰。