我有一个控制器
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 操作方法中得到的是空的。在源代码中我得到:
<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;
}
}
}
然后您可以简单地在 Url.Action() 调用中使用 RouteValues 属性。
<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 }
如果你的参数在你的路由中没有被称为Name,你只需要提供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() 方法,因为这就是将 ViewModel 对象传递给 Url.Action 方法返回这样一个链接的原因。此外,如果您想将 ViewModel 传递给 Action,则必须准备“http://url/Action?Name=x&Surname=y&IsPerion=0”形式的链接,以便 ModelBinder 可以识别它并绑定到 Action 参数。
你试过这个吗,
<img src="@Url.Action("DisplayData", "Home", Model)" alt="Image" />