将Html.ActionLink与复杂对象一起使用(包含其他对象)

时间:2014-12-04 22:04:11

标签: asp.net-mvc rest razor html.actionlink

所以正确到位,我正在尝试使用Html.ActionLink调用控制器方法,就像我在其他场合所做的那样,只是这一次,我给它一个本身包含另一个Object和一个字符串的Object。但是该对象总是为空。我在ViewBag中保持登录(它在那里,我检查过)。

课程:

public class Login
{
    [Required(ErrorMessage = "Username is required")] // make the field required
    [Display(Name = "Username")]  // Set the display name of the field
    public string Username{ get; set; }

    [Required(ErrorMessage = "Password is required")]
    [Display(Name = "Password")]
    public string Password{ get; set; }

    [Required(ErrorMessage = "Company is required")]
    [Display(Name = "Company")]
    public string Company{ get; set; }

}

public class Filter
    {
        public Login loginInfo;
        public string idDocument;
    }

Html.ActionLink调用:

@Html.ActionLink("Details", "DetailOrder", "Home", new {loginInfo = new { Company = ViewBag.loginInfo.Company, Username = ViewBag.loginInfo.Username, Password = ViewBag.loginInfo.Password }, idDocument = @Html.DisplayFor(modelItem => item.NumDoc) }, htmlAttributes:null)

控制器方法

public ViewResult DetailOrder(Filter afilter)
{
    ...
    return View(ans);
}

此时,我已经在ActionLink中尝试了一些方法,将对象设为:

2-new { loginInfo=ViewBag.loginInfo, idDocument= @Html.DisplayFor(modelItem => item.NumDoc)}
3-new { Username=ViewBag.loginInfo.Username, Password=ViewBag.loginInfo.Password, Company=ViewBag.loginInfo.Company, idDocument= @Html.DisplayFor(modelItem => item.NumDoc)}
4-new { afilter = new {loginInfo=ViewBag.loginInfo, idDocument= @Html.DisplayFor(modelItem => item.NumDoc)} }

我通过将控制器方法标题更改为:

来使其工作
public ViewResult DetailOrder(Login loginInfo, string idDocument)

然后在ActionLink中使用nr3对象组合。但这不是可重复使用的编码...... 我现在真的想知道如何将ActionLink与复杂的Object一起使用。它甚至可能吗?我没有在ms教程中找到一个例子。

由于

1 个答案:

答案 0 :(得分:1)

如果该对象仅包含值类型,则只能从对象构建路径值字典。在内部,帮助程序使用反射来返回对象中每个属性的.ToString()值。在以下情况

public class ObjectA
{
  public string Name { get; set; }
  public ObjectB MyObject { get; set; }
}

public class ObjectB
{
  public string Name { get; set; }
}

并尝试使用ObjectA创建路线,值为

/.../..?Name=Daniel&MyObject=YourAssembly.ObjectB

第一个值(name)可以正确绑定,但第二个值会尝试绑定字符串" YourAssembly.ObjectB"至MyObject哪个或当然不可以,MyObject将为null

不清楚为什么你会想要这样做或者你将获得什么好处(传递所有这些额外的查询字符串参数将很快超过限制并且只会减慢你的应用程序)