【问题标题】:ASP.NET Core exclude property of viewmodel when submitting form提交表单时 ASP.NET Core 排除视图模型的属性
【发布时间】:2019-07-16 08:14:23
【问题描述】:

我有一个控制器/动作/视图,其中包含一个生成报告的表单。

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

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

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 选项会填充两个日期选择器,其值将用于/report/ 操作参数中的fromDatetoDate。这不需要在生成报告时发送回 GET 操作。

然后填充视图中的表单,用户单击“获取报告”。此时,相同的 GET 操作被命中,但 entityId.HasValuetruefromDatetoDate 具有来自下拉列表的值,因此我拥有生成报告的所有信息。然后我生成一个完整的视图模型并将其返回到同一个视图。

我看到的一些问题:

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>

【问题讨论】:

  • 是否有任何演示可以重现您的问题?您的意思是您不希望 @Model.EntityAccounts 附加到查询字符串?如果是,服务器端如何使用它?
  • 嗨,服务器端不使用它,它只是在第一次填充下拉列表时返回它(但是一旦填充了下拉列表,我不需要将值返回给服务器)

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


【解决方案1】:

您可以在视图模型属性上使用[BindNever] 属性来防止模型绑定器设置它。

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

【讨论】:

  • 谢谢,如果我添加BindNeverRequired 等,客户端验证还会发生吗?
  • @globetrotter 是的,您仍然可以对模型进行验证。将属性设置为 BindNever 不会使模型状态无效;它只是忽略了该属性。但是,如果您的意思是在同一个属性上设置 BindNever 和 Required,我不确定您为什么要这样做?我不希望它通过验证。
  • 我的意思是,用户应该在提交表单时从EntityAccounts 下拉列表中选择EntityAccountDTO。所以客户端验证应该说“需要EntityAccount”(如果用户没有从下拉列表中选择一个选项)但没有提交表单返回服务器。我可能完全错误地构建了这个动作/视图,有一个 GET 动作来适应所有这些......
猜你喜欢
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
相关资源
最近更新 更多