asp.net MVC参数未通过

时间:2017-06-04 22:11:23

标签: c# asp.net 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>

现在,格式已填充,但选择始终为null。我错过了什么?

2 个答案:

答案 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