2014-12-04 125 views
1

所以正确的是,我想用Html.ActionLink调用一个控制器方法,就像我在其他ocasions中所做的一样,只有这一次,我给它一个本身包含另一个对象和一个字符串的对象。但该对象始终为空。我保持登录ViewBag(它在那里,我检查)。使用Html.ActionLink与复杂的对象(包含与其他对象)

的类:

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); 
} 

在这一点上,我已经尝试了一些东西,动作链接,通过给对象:

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用于复杂的对象。它甚至有可能吗?我还没有在ms教程中找到一个例子。

感谢

+0

该框架是为了把一个HTTP请求'?a = 1&b = 2&c = 3'成.NET可以理解的东西。我不明白为什么这应该是可能的 – beautifulcoder 2014-12-04 22:11:43

+0

你是否在查询字符串中传递真实密码?如果您已经拥有这些属性,为什么不将它们存储在某个存储或会话中? – 2014-12-04 22:17:20

+0

@VsevolodGoloviznin我正在使用休息架构,这是我找到的方式,所以我不需要在服务器端控制它。 – 2014-12-04 22:37:06

回答

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 

第一个值(名称)可以正确绑定,但第二个值将尝试绑定字符串“YourAssembly.ObjectB”到MyObject哪个或哪个过程不能,因此MyObject将是null

它不清楚你为什么会想这样做,或者你会达到什么样的好处(通过所有这些额外的查询字符串参数将很快超过了极限,只是减慢你的应用程序)

+0

谢谢你的回答。这引发了我一个问题,所以,如果我在类登录中覆盖ToString(),将其转换为与http请求兼容的格式,它可能会工作吗? – 2014-12-04 23:12:46

+0

实际上没有尝试过,所以不确定。你必须在'ToString()'中生成一个查询字符串,以及第一个查询参数(需要'?'而不是'&')的情况。意味着你的'ToString()'方法在除生成路由值之外的任何地方都不可用。你很快就会超过查询字符串长度的Http限制,并且应用程序会崩溃。你试图做的是一个可怕的设计,我不明白你为什么想要这样做。 – 2014-12-04 23:23:00

+0

当我做了它的工作后,我只是好奇它,我想知道为什么它不会工作。我完全理解你的观点,再次感谢你回答我的两个问题。 – 2014-12-04 23:28:47

相关问题