我有以下代码。我想取消使用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)
{
...
}
答案 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中接受整数数组。
您需要做的就是遵循将整数数组发布到服务器的过程,这就是为什么此问题作为寻求答案的重复问题而被关闭的原因。