首页 > 解决方案 > “InvalidDataException:超出表单值计数限制 1024。” 在 asp.net 核心中将超过 1000 个值从视图发布到控制器时,模型为 null

问题描述

我正在尝试根据角色向选定的候选人发送批量电子邮件。当我选择有限的选项时,模型会正确传递,但是一旦我从multiselect下拉列表中选择超过 1000 个选项并从模型中发布传递 null。

很奇怪,有什么原因吗?

电子邮件模板视图模型

public class EmailTemplateViewModel
{
    public EmailTemplateViewModel()
    {
        LstEmailTemplate = new List<EmailTemplateModel>();
        
        SendEmailModel = new SendEmailModel();
    }
    public List<EmailTemplateModel> LstEmailTemplate { get; set; }
   
    public Pager Pager { get; set; }
    public SendEmailModel SendEmailModel { get; set; }
}

看法

    @model Practise.Models.EmailTemplateViewModel
@using (Html.BeginForm("SentBulkEMail", "EmailTemplate", FormMethod.Post, new { @class = "form-horizontal" }))
                {
                    @Html.HiddenFor(x => x.SendEmailModel.EmailTemplateId, new { id = "hdnEmailTemplateId" })
                    <div class="form-group">
                        <label class="col-lg-2 control-label">User Type</label>
                        <div class="col-lg-10">
                            @Html.DropDownListFor(x => x.SendEmailModel.Roles, new SelectList(Roles, "Value", "Text"), new { id = "Roles", @class = "form-control select2", multiple = "multiple", @required = "required" })
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-lg-2 control-label">Recipients</label>
                        <div class="col-lg-10">
                            @Html.DropDownListFor(x => x.SendEmailModel.Recipient, new SelectList(ViewBag.Recipient as IEnumerable<SelectListItem>), "", new { id = "Recipients", multiple = "multiple", @required = "required", @class = "form-control" })
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-lg-2 control-label">Subject</label>
                        <div class="col-lg-10">
                            @Html.TextBoxFor(x => x.SendEmailModel.Subject, new { id = "subject", @class = "form-control", @required = "required" })
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-lg-2 control-label">Message</label>
                        <div class="col-lg-10">
                            @Html.TextAreaFor(x => x.SendEmailModel.Description, new { id = "hdndescription", @class = "form-control", @required = "required" })
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-lg-offset-2 col-lg-10">
                            <button class="btn btn-primary" type="submit">Send</button>
                            <button class="btn btn-danger" type="button" data-dismiss="modal">Close</button>
                        </div>
                    </div>
                }

控制器

[HttpPost]
        public async Task<IActionResult> SentBulkEMail(EmailTemplateViewModel emailTemplateViewModel)
        {
            CustomResponseModel response = new CustomResponseModel();
            response = await _emailTemplateService.SentBulkEmail(Request);
            if (response.IsSuccess)
            {
                TempData[Constant.Success] = response.Message;
            }
            else
            {
                TempData[Constant.Error] = response.Message;
            }
            return RedirectToAction("List");
        }

您可以从下图中获得更好的想法:

第一次我从多选中只选择了 4 个选项 在此处输入图像描述

Controller when select 4 options 在此处输入图像描述

第二选择超过1000

在此处输入图像描述

当我选择超过 1000 个选项时的控制器 在此处输入图像描述

标签: c#asp.net-coreasp.net-core-3.1bootstrap-multiselect

解决方案


最后我找到了答案。

默认请求值限制为1024.

为此,我们需要使用RequestFormLimits属性设置请求限制,如下所示:

[HttpPost]
[RequestFormLimits(ValueCountLimit = Int32.MaxValue)]
public async Task<IActionResult> SentBulkEMail(SendEmailModel emailModel)
{
}

使用ValueCountLimit添加此属性后,允许请求值最多,Int32.MaxValue或者您可以根据您的要求进行设置。


推荐阅读