2017-06-04 55 views
0

在我的控制器中我確實有這個端點:asp.net MVC參數沒有通過

async Task<FileResult> DownloadSelection(AssignedDatabaseSelection selection) 

我的HTML看起來像:

@if (Model.AssignedDatabaseSelections.Any()) 
{ 
    <table> 
     @foreach (var selection in Model.AssignedDatabaseSelections) 
     { 
      <tr> 
       <td>@selection.DisplayName</td> 
       <td width="10%"> 
        @Html.ActionLink(Strings.CsvLabel, "DownloadSelection", "Home", selection, null) 
       </td> 
      </tr> 
     } 
    </table> 
} 

現在,我想另一個參數添加到我的控制器方法:

async Task<FileResult> DownloadSelection(AssignedDatabaseSelection selection, DownloadFormat format) 

而且

@if (Model.AssignedDatabaseSelections.Any()) 
{ 
    <table> 
     @foreach (var selection in Model.AssignedDatabaseSelections) 
     { 
      <tr> 
       <td>@selection.DisplayName</td> 
       <td width="10%"> 
        @Html.ActionLink(Strings.CsvLabel, "DownloadSelection", "Home", new {selection = selection, Format = DownloadFormat.CSV}, null) 
       </td> 
       <td width="10%"> 
        @Html.ActionLink(Strings.ExcelLabel, "DownloadSelection", "Home", new { selection = selection, Format = DownloadFormat.CSV }, null) 
       </td> 
      </tr> 
     } 
    </table> 
} 

當我做了檢查內容,我得到這個:現在

<a href="/Home/DownloadSelection?selection=System.Data.Entity.DynamicProxies.AssignedDatabaseSele_D02B1D7B1220921CC4150FAA016EB8BFD5692B52C49949B0ECB80AA2F98E7355&amp;Format=CSV">Excel</a> 

,格式被填滿,但是選擇總是空。我錯過了什麼?

+0

如果您不添加'format'參數,您的選擇是否正常工作? – CodingYoshi

+0

mh,而不是當我通過一個新的對象,如新{選擇=選擇} – NPadrutt

+0

所以它沒有任何關係的第二個參數。你如何分配一個「選擇」? – CodingYoshi

回答

1

在你第一個例子中,第三個參數是一個複雜的對象(鍵入AssignedDatabaseSelections),並且該方法將正確地將對象的每個屬性序列化爲查詢字符串。請注意,它僅適用於您的對象只包含簡單屬性。

在第二個示例中,您將創建一個包含複雜對象的新對象。 ActionLink()方法(以及生成路由/查詢字符串值的所有方法)都會在對象的每個屬性上調用.ToString()方法(因此您可以獲得類的名稱)並且不執行遞歸。

如果要傳回AssignedDatabaseSelections對象以及其他屬性的所有屬性,你需要生成包含AssignedDatabaseSelections每個屬性的新對象,例如(假設它包含屬性IDName

@Html.ActionLink(Strings.CsvLabel, "DownloadSelection", "Home", 
    new { ID = selection.ID, Name = selection.Name, ......, Format = DownloadFormat.CSV }, null) 

請注意,如果AssignedDatabaseSelections包含許多屬性和/或更大的值,則可能會超出查詢字符串限制並拋出異常。更好的方法是通過AssignedDatabaseSelectionID屬性,並在GET方法中再次獲取對象,如果您需要其他屬性的話。

@Html.ActionLink(Strings.CsvLabel, "DownloadSelection", "Home", 
    new { ID = selection.ID, Format = DownloadFormat.CSV }, null) 
1

以下是如何使用對象創建與屬性的鏈接的示例。我包括創建視圖中的新員工的代碼,但這個可以/應該是在模型中:

@{ var emp = new Employee { Name = "Tom", Age = 44 }; } 
@Html.ActionLink("Test", "Test2", "Account", new {Name = emp.Name, Age = emp.Age }, null) 

請注意,我是如何傳遞Employee的每個屬性爲匿名對象爲路由值。

上述鏈接將與此操作一起使用。該DefaultModeBinder將採取名字從鏈接中的查詢字符串,並將其分配給Employee的屬性,並把它傳遞給下面的操作:

public ActionResult Test2(Employee emp) 
{ 
    return null; 
}