将Model变量绑定到ASP.NET MVC3中的Action方法

时间:2012-10-26 11:16:03

标签: c# asp.net-mvc-3 binding

我有一个控制器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正确地传递给局部视图。我做错了什么?

5 个答案:

答案 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" />