1

我有一个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这里描述的方式,但我在DisplayDataaction 方法中得到的是 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" />

所以它实际上是在传递类型而不是值。唯一正确传递的变量值是 boolIsSpecial

ViewModel 反而被正确地传递给局部视图。我究竟做错了什么?

4

2 回答 2

1

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

您需要执行以下操作来生成 URL:

@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" />
}

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

但这当然取决于列表的长度。如果它们的长度不同,这将不起作用。

希望这可以帮助。

于 2012-11-01T13:38:14.703 回答
1

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

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

于 2012-11-01T13:38:59.630 回答