我有一个控制器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 action方法中得到的是null。在源代码中我得到:
<img src="/Home/DisplayData?filters=AppName.ViewModels.MyViewModel" alt="Image" />
所以它实际上传递的是类型而不是值。
而ViewModel
却被正确地传递给了部分视图。我做错了什么?
5条答案
按热度按时间jc3wubiy1#
我通常在模型中添加以下内容:
然后,您可以在Url.Action()调用中简单地使用RouteValues属性。
或者,如果你喜欢更少的(显式的)代码,忽略模型的变化,简单地这样做:
bvhaajcl2#
它不会将整个对象序列化为查询字符串,您必须显式设置每个值,即
如果您的参数在路由中不被称为Name,则只需要提供nameFilter。
xlpyo6sf3#
你正在尝试使用整个视图模型创建一个img src链接,我不认为这是你真正想要的。
相反,你会将模型表示的任何东西的ID作为链接(过滤器)上的查询字符串参数传递。
渲染出类似于。。
然后,您可以在操作中使用ID来查找您试图显示的任何资源。
xxhby3vn4#
如果你想以你描述的方式传递model,那么你必须覆盖ViewModel类的ToString()方法,因为这就是为什么将ViewModel对象传递给Url.Action方法会返回这样一个链接的原因。另外,如果你想将ViewModel传递给Action,你必须以“http://url/Action?Name=x&Surname=y&IsPerion=0”的形式准备链接,这样ModelBinder才能识别它并绑定到Action参数。
9q78igpj5#
你试过这个吗