是否可以在ASP.NET MVC中的控制器之间传递类?

时间:2009-10-21 02:08:19

标签: asp.net-mvc routing controller

是否可以在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列表。现在,我有两个控制器,AreasControllerBuildingsController。两者都有Index()方法。我想要做的是将此URL导航到:

  

http://localhost/Areas/

它会列出所有区域。然后,当你转到这个URL:

  

http://localhost/Areas/1/Buildings/

它将列出ID为1的区域的所有建筑物。在BuildingsController中,我将ID作为int接收,然后使用它来查找正确的区域,如下所示:

public ActionResult Index(int areaId)
{
    var area = areaRepository.GetById(areaId);
    return View(area.Buildings);
}

现在,这对我来说似乎很笨重。必须以int形式接收areaId,然后我必须再次访问存储库以获取实际的Area对象。我有什么方法可以做到这一点:

public ActionResult Index(Area area)
{
    return View(area.Buildings);
}

并没有再次点击存储库并重新检索已经实例化的对象?我倾向于否,因为HTTP的工作原理(你不能在URL中放置一个对象),但也许有人有一个巧妙的技巧。

2 个答案:

答案 0 :(得分:2)

是的,有可能。更重要的是,它被内置于MVC本身,并被称为“ModelBinders”。模型绑定器使用反射来匹配查询字符串/表单键/值对与CustomADT类对象。只要你的表单提交相同的属性名称,你所拥有的就会完美地运作。

你的表格......

<% using (Html.BeginForm()) { %>

  <%= Html.TextBox("Title", Model.Title) %>
  <%= Html.TextBox("Description", Model.Description) %>

<% } %>

你的班级......

public class CustomADT
{
  public String Title {get; set;}
  public String Description {get; set;}
}

注意您的类属性如何与表单键/值匹配? ASP.NET MVC具有内置功能,它将使用上面的示例索引(CustomADT adt)将它们映射到一起。

如果您对绑定有特殊要求,可以创建自己的自定义IModelBinder类,并在global.asax中注册它,以便在表单键/值对与模型(类)之间进行自定义映射。 (bing it)

另外,我强烈建议您阅读ASP.NET MVC的“ViewModel”模式(bing it)。

我还写过关于如何使用强类型操作方法的博客,它允许您将类从视图传递到控制器(并在控制器中,使用我提到的Microsoft.Web.Mvc程序集中的扩展)

http://eduncan911.com/archive/tags/Asp.Net+Mvc/default.aspx

最后,没有从模型到查询字符串的直接转换,无法在控制器上调用另一个操作方法。但是,您可以使用默认的模型绑定来反映您的模型并为您创建它们:

return RedirectToAction("Index", "Home", myCustomADT);

我认为应该工作,因为最后一个参数是一个将作为查询字符串附加的集合。如果没有(我有疑问),你需要将每个属性作为匿名集合的一部分传递(,new {Title = myCustomADT.Title,Description = myCustomADT.Description);)。

更好的问题是,你为什么要这样做?你真的想要重定向并传递视图模型。

答案 1 :(得分:0)

我在这里找到了一个可能的答案:

http://msdn.microsoft.com/en-us/library/dd394711%28VS.100%29.aspx

在标题为在行动方法之间传递状态的部分下。基本上,您将对象存储在TempData字典中,然后将其作为字符串引用。这是一个丑陋的解决方案,因为它不是强类型的。