【发布时间】:2009-10-21 02:08:19
【问题描述】:
是否可以在 ASP.NET MVC 控制器中执行类似的操作?
public ActionResult Index(CustomADT adt)
{
...
}
当你点击一个链接时,你会从另一个控制器传入一个类。还是只能传递字符串?
编辑:
稍微详细一点。假设我有以下类层次结构:
public class Area
{
public string Name { get; set; }
public ICollection<Building> Buildings { get; set; }
}
public class Building
{
public string Name { get; set; }
}
所以Area 包含Buildings 的列表。现在,我有两个控制器,AreasController 和 BuildingsController。两者都有一个Index() 方法。我想做的是当这个 URL 被导航到:
它将列出所有区域。然后,当您转到此 URL 时:
它将列出 ID 为 1 的区域的所有建筑物。在BuildingsController 中,我收到一个 int 形式的 ID,然后使用它来查找正确的区域,如下所示:
public ActionResult Index(int areaId)
{
var area = areaRepository.GetById(areaId);
return View(area.Buildings);
}
现在,这对我来说似乎很笨拙。 areaId 必须作为 int 接收,然后我必须再次访问存储库以获取实际的 Area 对象。有什么办法可以代替:
public ActionResult Index(Area area)
{
return View(area.Buildings);
}
而不是再次访问存储库并重新检索已经实例化的对象?由于 HTTP 的工作原理(您不能在 URL 中放置对象),我倾向于不,但也许有人有一个巧妙的技巧。
【问题讨论】:
-
您似乎正在尝试解决问题中未描述的问题。这个问题的背景是什么?
-
没有太多背景,真的。在我见过的所有教程中,它们仅在控制器之间传递字符串和整数(实际上是转换为整数的字符串),就像您单击链接时一样。这就是 HTTP 的工作方式,但不是编程的工作方式。由于控制器只是类,我想知道是否有任何方法可以在控制器之间传递类,但现在我考虑了一下,我认为这是不可能的,因为你正在发出一个 HTTP 请求,然后调用一个控制器。
-
“不要再次访问存储库并重新检索已经实例化的对象”......已经在哪里?如果您的控制器操作没有查找此内容,那会是什么? (正如您所提到的,HTTP 的无状态特性意味着在您自己的代码之外真的没有任何东西那里。
ModelBinder行为尽管如此。) -
好点 Sixten。我是从以下角度考虑的,要进入 Buildings 视图,您必须通过 Areas 视图,但很可能是用户键入 URL 而不是在 Areas 视图上点击链接。
标签: asp.net-mvc routing controller