如何从客户端接收IEnumerable <int>?

时间:2019-05-24 18:45:55

标签: javascript c# json

我有以下代码。我想取消使用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)
{
    ...
}

3 个答案:

答案 0 :(得分:0)

您似乎正在阻止将值重新发布到此处的javascript中:

window.jQuery("#massMailForm").submit

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

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

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

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

答案 1 :(得分:0)

我实际上不确定是否可以在不更改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.建议的链接进行操作

答案 2 :(得分:0)

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

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

您需要做的就是遵循将整数数组发布到服务器的过程,这就是为什么此问题作为寻求答案的重复问题而被关闭的原因。