2014-12-04 122 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

相關問題