如何从客户端接收 IEnumerable<int>? [复制]

Posted

技术标签:

【中文标题】如何从客户端接收 IEnumerable<int>? [复制]【英文标题】:How to receive IEnumerable<int> from client? [duplicate] 【发布时间】:2019-10-11 09:05:38 【问题描述】:

我有以下代码。我想取消 ContactIdsString,但我不知道如何将 javascript 中的 int[] 发送到 C# 中的 IEnumerable。有什么办法吗?

html

@model MyNamespace.Models.MassMailViewModel
@section scripts

    @Scripts.Render("~/bundles/mass-mail")
    <script>
        var contactIdsName = '@nameof(MassMailViewModel.ContactIdsString)'
    </script>


@using (Html.BeginForm(nameof(MassMailController.SendMail), "MassMail", FormMethod.Post, new  id = "massMailForm" ))

    @(Html.Kendo().Button()
        .Name("massMailButton")
        .Content("Send")
        .HtmlAttributes(new  type = "submit" )
    )

    @Html.HiddenFor(m => m.ContactIdsString)

    ...bunch of code for contact-mass-mail-grid...

JavaScript:

window.jQuery(function () 
    window.jQuery("#massMailForm").submit(function () 
        var ids = $('#contact-mass-mail-grid').data('kendoGrid').selectedKeyNames();
        var idsJson = JSON.stringify(ids);

        var hiddenField = $('#' + window.contactIdsName);
        hiddenField.val(idsJson);
    );
);

查看模型:

public class MassMailViewModel

    public string ContactIdsString  get; set; //TODO I'd like to not have to do this.
    public IEnumerable<int> ContactIds => JsonConvert.DeserializeObject<IEnumerable<int>>(ContactIdsString);

控制器:

public ActionResult SendMail(MassMailViewModel vm)

    ...

【问题讨论】:

【参考方案1】:

您似乎正在阻止将值发回您的 javascript 中:

window.jQuery("#massMailForm").submit

由于您在此处的表单中隐藏了 ContactIdsString 数据:

@Html.HiddenFor(m =&gt; m.ContactIdsString)

为什么不通过删除提交事件处理程序让表单提交?

如果您不想这样做,则必须通过 ajax 调用提交数据。 在这里查看更多 ajax 信息https://developer.mozilla.org/en-US/docs/Web/Guide/AJAX

【讨论】:

【参考方案2】:

实际上,我不确定您是否可以在不更改 HTML 的情况下完成您想要的工作,而且我认为您展示的 HTML 不够多,无法真正了解需要更改的内容。隐藏字段只是一个输入,因此您实际上只能在其中存储一个值。我不确定 razer 引擎是否允许您在单个输入中进出数组。

但是,您可以做的低影响是创建一个新的 getter 并保留 ContactIdsString。

    public class MassMailViewModel

    public string ContactIdsString  get; set; //TODO I'd like to not have to do this.
    public IEnumerable<int> ContactIds => this.ContactIdsString.Split(',').Select(n => int.Parse(n));

如果您真的想完全摆脱它,您必须按照@Kenneth K. 建议的链接进行操作

【讨论】:

【参考方案3】:

我认为您对 IEnumerable 的工作方式有一点误解。 IEnumerable 用于公开将作用于一组物化数据的枚举器。在这种情况下,从客户端发送到服务器的数据 已物化,因此无需尝试使用 IEnumerable 对其进行定义。

ASP.NET MVC 的模型绑定器将尝试初始化发送的值,因此就像 IEnumerable&lt;int&gt; numbers = new int[]1,2,3; 将起作用一样,将整数数组接受到该 IEnumerable 中。

您所需要做的就是按照将整数数组发布到服务器的过程,这就是为什么这个问题作为寻求该答案的问题的副本而被关闭的原因。

【讨论】:

好的,int[] 是可以接受的。但是,当我将 ContactIdsString 的类型从 string 更改为 int[] 时,它现在没有收到任何内容(只是变为 null)。

以上是关于如何从客户端接收 IEnumerable<int>? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将生成 IEnumerable<T> 的 TransformBlock 链接到接收 T 的块

如何创建调用 IEnumerable<TSource>.Any(...) 的表达式树?

如何从 C# 中的同一方法返回字符串以及 IEnumerable<T>? [复制]

如何使用 LINQ 从 DataTable 中以 IEnumerable<MODEL> 形式获取数据?

如何从表达式主体成员返回空的 IEnumerable [重复]

无法从 IEnumerable<Model> 更改 foreach 中的值