提交表单时,ASP.NET Core排除viewmodel的属性

时间:2019-07-16 08:14:23

标签: c# asp.net asp.net-mvc asp.net-core

我有一个控制器/操作/视图,其中包含用于生成报告的表格。

public async Task<IActionResult> Report(int? entityId, DateTime fromDate, DateTime toDate)
{
}

在HTTP GET上,我首先检查entityId是否为空。如果是这样,我假设用户正在导航到/report/来填充表单字段以生成报告,因此我只返回一个包含有关下拉列表等信息的局部viewmodel:

public class ReportViewModel
{
    // ...

    // this is populated as user has to choose one of these via dropdown
    // to generate a report.  
    public IEnumerable<EntityAccountDTO> EntityAccounts { get; set; }

    // ... other properties left unpopulated at this point
}

从下拉列表中选择一个EntityAccounts选项将使用两个值选择器填充这些值,这些值将用于fromDate操作参数中的toDate/report/。生成报告时,不需要将其发送回GET操作。

然后填充视图中的表单,并且用户单击“获取报告”。此时,执行了相同的GET操作,但是entityId.HasValuetruefromDatetoDate具有下拉菜单中的值,因此我具有生成报告的所有信息。然后,我生成一个完整的viewmodel并将其返回到同一视图。

我看到了一些问题:

EntityAccounts的下拉列表提交回该操作(我可以在查询字符串中看到它)。如前所述,这只是供用户初始选择一个值,我不需要将其提交回操作。如何防止它被提交?

    <label asp-for="@Model.EntityAccounts">Entity accounts</label>
    <!-- Input -->
    <select asp-for="@Model.EntityAccounts" class="form-control" data-toggle="select">
        @foreach () { //... generate <option>s }                           
    </select>

1 个答案:

答案 0 :(得分:0)

您可以在视图模型属性上使用[BindNever]属性,以防止模型绑定程序进行设置。

[BindNever]
public IEnumerable<EntityAccountDTO> EntityAccounts { get; set; }