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

我有一个控制器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); } Image 

我使用Url.Action如何在这里描述,但我在DisplayData操作方法中得到的是null。 在我得到的源代码中:

 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属性即可。

 Image 

或者,如果您更喜欢较少(显式)代码,请忽略模型更改并简单地执行此操作:

 Image 

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

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

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

您正在尝试使用整个视图模型创建img src链接,我认为这不是您想要的。

相反,您将传递模型表示的任何ID作为链接上的查询字符串参数(filter)。 所以例如使用……

 Image 

要呈现类似……

 Image 

然后,您可以在操作中使用Id来查找您要显示的资源。

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

你试过这个吗

 Image