如何通过ActionLink传递ASP.NETMVC模型?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

我想通过点击一个模型和int一个控制器ActionLink

@Html.ActionLink("Next", "Lookup", "User", new { m = Model.UserLookupViewModel, page = Model.UserLookupViewModel.curPage }, null)

不起作用,而是传递模型的空白实例,这是使用时期望的new

@Html.ActionLink("Next", "Lookup", "User", Model.UserLookupViewModel, null)

确实有用。

控制器

[HttpGet]
public ActionResult Lookup(UserLookupViewModel m, int page = 0)
{
    return this.DoLookup(m, page);
}

视图模型

public class UserLookupViewModel
{
    public int curPage { get; set; }

    [Display(Name = "Forenames")]
    public string Forenames { get; set; }

    [Display(Name = "Surname")]
    public string Surname { get; set; }

    [Display(Name = "DOB")]
    public DateTime? DoB { get; set; }

    [Display(Name = "Post code")]
    public string Postcode { get; set; }
}

我怎样才能将它们传递到一起?该Lookup方法的参数与ActionLink中的命名属性相匹配。

提问于
用户回答回答于

不能使用ActionLink通过链接传递属性,但可以执行以下操作来获得相同的行为。

<form action="/url/to/action" Method="GET">
  <input type="hidden" name="Property" value="hello,world" />
  <button type="submit">Go To User</button>
</form>

如果创建了一个帮助程序来生成这些GET表单,将可以像定期链接按钮一样对其进行设置。我唯一要警告的是页面上的所有表单都容易修改,所以我不会相信这些数据。当你到达目的地时,我宁愿再次提取数据。

创建搜索动作时,我使用上述技巧,并希望保留搜索历史记录并保持后退按钮正常工作。

希望这可以帮助,

这是起作用的原因。

@Html.ActionLink("Next", "Lookup", "User", Model.UserLookupViewModel, null)

是因为ActionLink方法的参数列表被泛化以获得一个对象,所以它会占用任何东西。它将使用该对象将它传递给RouteValueDictionary,然后尝试根据该对象的属性创建查询字符串。

如果你说这个方法在上面工作,你也可以尝试添加一个名为Id的视图模型的新属性,它会像你想要的那样工作。

用户回答回答于

必须将模型序列化为JSON字符串,然后将其发送给控制器以变为对象。

这是你的动作链接:

@Html.ActionLink("Next", "Lookup", "User", new { JSONModel = Json.Encode(Model.UserLookupViewModel), page = Model.UserLookupViewModel.curPage }, null)

在控制器中,需要一个方法将JSON数据转换为MemoryStream:

private Stream GenerateStreamFromString(string s)
{
  MemoryStream stream = new MemoryStream();
  StreamWriter writer = new StreamWriter(stream);
  writer.Write(s);
  writer.Flush();
  stream.Position = 0;
  return stream;
}

在ActionResult中,将JSON字符串转换为一个对象:

public ActionResult YourAction(string JSONModel, int page)
{
  DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Model.UserLookupViewModel));
  var yourobject =  (UserLookupViewModel)ser.ReadObject(GenerateStreamFromString(JSONModel));
}

扫码关注云+社区