2

我有一个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 操作方法中得到的是 null。在我得到的源代码中:

<img src="/Home/DisplayData?filters=AppName.ViewModels.MyViewModel" alt="Image" />

所以它实际上是在传递类型而不是值。

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

4

5 回答 5

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" />
于 2012-10-26T14:35:55.547 回答
2

它不会将您的整个对象序列化为您必须明确设置每个值的查询字符串,即

new { nameFilter = @Model.Name, @Model.Surname, @Model.IsPeriod }

如果您的参数在您的路由中没有被称为 Name,您只需要提供 nameFilter。

于 2012-10-26T11:22:21.977 回答
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 来查找您要显示的资源。

于 2012-10-26T11:22:04.123 回答
1

如果您想以您描述的方式传递模型,则必须覆盖 ViewModel 类的 ToString() 方法,因为这就是将 ViewModel 对象传递给 Url.Action 方法返回此类链接的原因。此外,如果您想将 ViewModel 传递给 Action,您必须准备“http://url/Action?Name=x&Surname=y&IsPerion=0”形式的链接,以便 ModelBinder 可以识别它并绑定到 Action 参数。

于 2012-10-26T11:23:25.747 回答
1

你试过这个吗,

<img src="@Url.Action("DisplayData", "Home", Model)" alt="Image" />
于 2012-10-26T14:58:21.680 回答