在我的控制器中,我确实有这个端点:
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&Format=CSV">Excel</a>
现在,格式已填充,但选择始终为null。我错过了什么?
答案 0 :(得分:1)
以下是如何使用对象创建属性链接的示例。我在视图中包含了创建新Employee的代码,但这可以/应该在模型中:
@{ 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;
}
答案 1 :(得分:1)
在第一个示例中,第3个参数是一个复杂对象(typeof AssignedDatabaseSelections
),该方法将正确地将对象的每个属性序列化为查询字符串。请注意,它仅起作用,因为您的对象仅包含简单属性。
在第二个示例中,您创建一个包含复杂对象的新对象。 ActionLink()
方法(以及生成路由/查询字符串值的所有方法)在对象中的每个属性上调用.ToString()
方法(因此您获得了类的名称)并且不进行递归。 / p>
如果要传回AssignedDatabaseSelections
对象的所有属性以及另一个属性,则需要生成一个包含AssignedDatabaseSelections
的每个属性的新对象(假设它包含属性{{1} }和ID
)
Name
请注意,如果@Html.ActionLink(Strings.CsvLabel, "DownloadSelection", "Home",
new { ID = selection.ID, Name = selection.Name, ......, Format = DownloadFormat.CSV }, null)
包含大量属性和/或更大的值,则可能会超出查询字符串限制并抛出异常。更好的方法是传递AssignedDatabaseSelections
的{{1}}属性,如果需要其他属性,可以在GET方法中再次获取对象。
ID