当我想在.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]属性)?
答案 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 = "" }
);
注意如果网址上没有提供controller
和action
,则如何定义默认值。
函数的名称通常不应该定义它的作用
为什么不在地球上?函数名称应完全 定义该函数的功能。
此外,恰好是View()定义的
最后,是否有一个属性允许我返回带有不同函数名称的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属性:
此致