2017-06-04 54 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; 
}