是否可以在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
中,我将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中放置一个对象),但也许有人有一个巧妙的技巧。
答案 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
字典中,然后将其作为字符串引用。这是一个丑陋的解决方案,因为它不是强类型的。