我有一个控制器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&Name=System.Collections.Generic.List%601%5BSystem.String%5D&CustomVM=System.Collections.Generic.List%601%5BVestibule.AppName.ViewModels.CustomViewModel%5D"" alt="Image" />
所以实际传递的是类型而不是值。唯一正确传递的变量值是bool IsSpecial
而是将ViewModel正确传递给局部视图。我做错了什么?
答案 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()方法,可能是将它们包装在您自己的容器类型中。