.net MVC控制器究竟知道返回哪个View()?

时间:2016-03-09 20:31:48

标签: asp.net .net asp.net-mvc controller

当我想在.net中调用新页面时,请说出" About.cshtml"页面,我在HomeController中使用以下代码:

public ActionResult About()
{
    ViewBag.Title = "About";
    return View();
}

要打电话给我,请使用指向" / Home / About"的链接。如果我想创建一个名为" Contact.cshtml"的新页面,例如,我复制上面的内容并替换About with Contact。

我知道" / Home"调用HomeController。但是,该控制器究竟如何知道返回About.cshtml页面?我假设它基于函数的名称。但这对我来说听起来并不合适。关于()不是像Get()或Post()这样的HTTP动词,并且函数的名称通常不应该定义它的作用,除非它已经存在。

此外,究竟是什么时候定义View(),什么时候分配给About.cshtml页面?

最后,是否有一个属性允许我返回带有不同函数名的About.cshtml页面(因为我可以设置一个函数来响应Get [HttpGet]属性)?

2 个答案:

答案 0 :(得分:3)

  

但是,该控制器究竟如何知道返回About.cshtml页面?

因为操作方法名称为About

public ActionResult About()

该路由通过URL找到该方法:

/Home/About

如果网址未包含操作:

/Home

然后它会寻找默认动作。通常这是Index(),由默认路由映射配置:

routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = "" }
        );

注意如果网址上没有提供controlleraction,则如何定义默认值。

  

函数的名称通常不应该定义它的作用

为什么不在地球上?函数名称​​应完全 定义该函数的功能。

  

此外,恰好是View()定义的

它在the base controller class

  

最后,是否有一个属性允许我返回带有不同函数名称的About.cshtml页面

不是属性本身,但您可以在调用View()时指定视图名称:

return View("SomeOtherView");

答案 1 :(得分:1)

仅解释一些(David的反应非常好), View()是类 ViewResultBase 的对象,在类控制器

protected internal ViewResult View()
{
    return View(viewName: null, masterName: null, model: null);
}

ViewResultBase有一个方法 ExecuteResult(),它接收类型为 ControllerContext 的参数(此参数包含有关请求的信息),并且在此方法中,如果名称为视图为null,视图名称是根据url(阅读David关于路由的说明)建立的,称为访问RouteData:

public override void ExecuteResult(ControllerContext context)
{
    if (context == null)
    {
        throw new ArgumentNullException("context");
    }
    if (String.IsNullOrEmpty(ViewName))
    {
        ViewName = context.RouteData.GetRequiredString("action");
    }
    ....
}

在这里,如果您观察RouteData,您可以查看被调用的操作是Index,并且此值设置为ViewName属性:

enter image description here

此致