首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何接收来自客户端的IEnumerable<int>?

如何接收来自客户端的IEnumerable<int>?
EN

Stack Overflow用户
提问于 2019-05-25 02:45:55
回答 3查看 255关注 0票数 1

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

Html:

代码语言:javascript
复制
@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:

代码语言: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);
    });
});

查看模型:

代码语言:javascript
复制
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);
}

控制器:

代码语言:javascript
复制
public ActionResult SendMail(MassMailViewModel vm)
{
    ...
}
EN

回答 3

Stack Overflow用户

发布于 2019-05-25 03:04:19

看起来你在这里阻止了这个值在你的javascript中回发:

window.jQuery("#massMailForm").submit

由于您在下面的表单中隐藏了ContactIdsString数据:

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

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

如果您不想这样做,则必须通过ajax调用提交数据。

查看此处获取更多ajax信息https://developer.mozilla.org/en-US/docs/Web/Guide/AJAX

票数 0
EN

Stack Overflow用户

发布于 2019-05-25 03:04:22

实际上,我不确定您是否可以在不更改HTML的情况下完成您想要的内容,而且我不认为您展示了足够多的HTML来真正了解需要更改的内容。隐藏字段只是一个输入,所以您实际上只有一个可以存储在其中的值。我不确定razer引擎是否允许您在单个输入中与数组来回切换。

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

代码语言:javascript
复制
    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建议的链接

票数 0
EN

Stack Overflow用户

发布于 2019-05-25 03:16:42

我认为您对IEnumerable的工作方式有一点误解。IEnumerable用于公开一个枚举器,该枚举器将作用于一组物化数据。在这种情况下,从客户端发送到服务器的数据被具体化,因此不需要尝试使用IEnumerable来定义它。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56298104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档