我有一个控制器HomeController
有以下action method
:
[HttpPost]
public ActionResult DisplayData(MyViewModel myViewModel)
{
// Do something with myViewModel
}
该ViewModel
:
public class MyViewModel
{
public string Name { get; set; }
public string Surname { get; set; }
public bool IsPeriod { get; set; }
}
而下面的View
@model AppName.ViewModels.MyViewModel
@{ Html.RenderPartial("MyPartialView", Model); }
<img src="@Url.Action("DisplayData", "Home", new { myViewModel = Model })" alt="Image" />
我用它是如何描述的Url.Action 这里 ,但我所得到的DisplayData操作方法为空。 在源代码中我得到:
<img src="/Home/DisplayData?filters=AppName.ViewModels.MyViewModel" alt="Image" />
所以它不是实际传递值的类型。
该ViewModel
代替被正确地传递到局部视图。 我究竟做错了什么?
我通常会添加以下到我的模型:
public class MyViewModel
{
public string Name { get; set; }
public string Surname { get; set; }
public bool IsPeriod { get; set; }
public RouteValueDictionary RouteValues
{
get
{
var rvd = new RouteValueDictionary();
rvd["name"] = Name;
rvd["surname"] = Surname;
rvd["isPeriod"] = IsPeriod;
return rvd;
}
}
}
然后,你可以简单地使用RouteValues财产在你Url.Action()调用。
<img src="@Url.Action("DisplayData", "Home", Model.RouteValues)" alt="Image" />
或者,如果你喜欢更小(明确的)代码,忽略模式的变化,只是这样做:
<img src="@Url.Action("DisplayData", "Home", new RouteValueDictionary(Model)" alt="Image" />
它不会序列化整个对象的查询字符串必须显式设置每个值,即
new { nameFilter = @Model.Name, @Model.Surname, @Model.IsPeriod }
您只需要提供nameFilter如果您的路由你的参数不叫名字。
您正在试图创建一个使用一个完整的视图模型的IMG SRC的链接,我不认为这是你想要真的是。
相反,你会通过什么的模型表示为纽带(过滤器)上的查询字符串参数的ID。 因此,例如使用...
<img src="@Url.Action("DisplayData", "Home", new { filters = Model.Id })" alt="Image" />
为了使像...
<img src="/Home/DisplayData?filters=1" alt="Image" />
然后你可以使用ID在你的行动,查找任何资源是你试图显示。
如果你想传递模型,你所描述,那么你必须重写你的ViewModel类的ToString()方法的方式,因为这就是为什么通过你的视图模型对象Url.Action方法返回这种联系的原因。 另外,如果你想通过您的视图模型来操作,必须在形式准备链接的“http:// URL /动作名称= X&姓= Y&IsPerion = 0?”这样ModelBinder的可识别它,并绑定到操作参数。
你试试这个,
<img src="@Url.Action("DisplayData", "Home", Model)" alt="Image" />