我有一个控制器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如何描述here,但我在DisplayData操作方法中得到的是null。在我得到的源代码中:
<img src="/Home/DisplayData?filters=AppName.ViewModels.MyViewModel" alt="Image" />
所以实际传递的是类型而不是值。
ViewModel
正确地传递给局部视图。我做错了什么?
答案 0 :(得分:13)
我通常会将以下内容添加到我的模型中:
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;
}
}
}
然后,您只需在Url.Action()调用中使用RouteValues属性即可。
<img src="@Url.Action("DisplayData", "Home", Model.RouteValues)" alt="Image" />
或者,如果您更喜欢较少(显式)代码,请忽略模型更改并简单地执行此操作:
<img src="@Url.Action("DisplayData", "Home", new RouteValueDictionary(Model)" alt="Image" />
答案 1 :(得分:2)
它不会将整个对象序列化为您必须明确设置每个值的查询字符串,即
new { nameFilter = @Model.Name, @Model.Surname, @Model.IsPeriod }
如果你的参数在你的路由中没有被称为Name,你只需要提供nameFilter。
答案 2 :(得分:1)
您正在尝试使用整个视图模型创建img src链接,我认为这不是您想要的。
相反,您将传递模型表示的任何ID作为链接上的查询字符串参数(过滤器)。例如,使用......
<img src="@Url.Action("DisplayData", "Home", new { filters = Model.Id })" alt="Image" />
渲染类似......
<img src="/Home/DisplayData?filters=1" alt="Image" />
然后,您可以在操作中使用Id来查找您要显示的资源。
答案 3 :(得分:1)
如果要按照描述的方式传递模型,则必须覆盖ViewModel类的ToString()方法,因为这是将ViewModel对象传递给Url.Action方法返回此类链接的原因。此外,如果要将ViewModel传递给Action,则必须以“http:// url / Action?Name = x&amp; Surname = y&amp; IsPerion = 0”的形式准备链接,以便ModelBinder识别它并绑定到Action参数。
答案 4 :(得分:1)
你试过这个吗,
<img src="@Url.Action("DisplayData", "Home", Model)" alt="Image" />