我有以下代码。我想废除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)
{
...
}发布于 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
发布于 2019-05-25 03:04:22
实际上,我不确定您是否可以在不更改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建议的链接
发布于 2019-05-25 03:16:42
我认为您对IEnumerable的工作方式有一点误解。IEnumerable用于公开一个枚举器,该枚举器将作用于一组物化数据。在这种情况下,从客户端发送到服务器的数据被具体化,因此不需要尝试使用IEnumerable来定义它。
ASP.NET MVC的模型绑定器将尝试初始化发送的值,因此就像IEnumerable<int> numbers = new int[]{1,2,3};将工作一样,将整数数组接受到该IEnumerable中。
您所需要做的就是按照将一组整数发送到服务器的过程进行操作,这就是为什么此问题作为寻求该答案的问题的副本而关闭的原因。
https://stackoverflow.com/questions/56298104
复制相似问题