在MVC3中将具有List属性的类绑定到View to Action Method

时间:2012-11-01 12:55:55

标签: asp.net-mvc-3 list binding actionmethod

我有一个控制器HomeController,其中包含以下操作方法:

public ActionResult DisplayData(MyViewModel myViewModel)
{
   // Do something with myViewModel           
}

ViewModel

public class MyViewModel
{
    public List<string> Names { get; set; }
    public List<CustomViewModel> CustomVM { get; set; }
    public bool IsSpecial { get; set; }
}

以下View

@model AppName.ViewModels.MyViewModel

@{ Html.RenderPartial("MyPartialView", Model);  }

<img src="@Url.Action("DisplayData", "Home", new RouteValueDictionary(Model))" alt="Image" />

我使用Url.Action这里描述的内容,但我在DisplayData操作方法中获得的内容为null。在我得到的源代码中:

<img src="/Home/DisplayData?IsSpecial=true&amp;Name=System.Collections.Generic.List%601%5BSystem.String%5D&amp;CustomVM=System.Collections.Generic.List%601%5BVestibule.AppName.ViewModels.CustomViewModel%5D"" alt="Image" />

所以实际传递的是类型而不是值。唯一正确传递的变量值是bool IsSpecial

而是将ViewModel正确传递给局部视图。我做错了什么?

2 个答案:

答案 0 :(得分:1)

“问题”是列表。 MVC试图绑定列表对象本身,而不是它们的值。有关绑定集合的示例,请参阅here

您需要按以下方式生成网址:

@for (int i = 0; i < Model.Names.Count(); i++)
{
 <img src="@Url.Action("DisplayData", "Home", new { IsSpecial = Model.IsSpecial, Name = Model.Names[i], CustomVM = Model.CustomVM[i].Property })" alt="Image" />
}

可能包含错误,我没有测试过。在你的情况下,它可能不是最好的方式,它只是一个例子

但这当然取决于你的名单的长度。如果它们有不同的长度,这将无效。

希望这有帮助。

答案 1 :(得分:1)

您真的想将两个列表都传递给GET操作吗? GET通常用于获取幂等实体。

您可能希望使用POST将数据发送到服务器,或者您必须查看覆盖这些列表的ToString()方法,可能是将它们包装在您自己的容器类型中。