在表单提交时将日期的JavaScript数组绑定到页面的视图模型
我在表单中添加了以下字段:在表单提交时将日期的JavaScript数组绑定到页面的视图模型,javascript,asp.net,json,asp.net-mvc,viewmodel,Javascript,Asp.net,Json,Asp.net Mvc,Viewmodel,我在表单中添加了以下字段: <input asp-for="MyDates" type="hidden" name="MyDates" id="MyDates" /> 在我的JavaScript中,我允许用户从日程表中选择多个日期,并将它们存储在一个数组中。每次更新数组时,我都会使用JSON.stringifyarray另外更新隐藏输入字段的值。在提交表单之前,html的外观如下所示: <input type="hidden" name="MyDates" id="MyDat
<input asp-for="MyDates" type="hidden" name="MyDates" id="MyDates" />
在我的JavaScript中,我允许用户从日程表中选择多个日期,并将它们存储在一个数组中。每次更新数组时,我都会使用JSON.stringifyarray另外更新隐藏输入字段的值。在提交表单之前,html的外观如下所示:
<input type="hidden" name="MyDates" id="MyDates" value="["2016-02-17T05:00:00.000Z","2016-02-16T05:00:00.000Z","2016-02-11T05:00:00.000Z","2016-02-12T05:00:00.000Z","2016-02-19T05:00:00.000Z"]">
当用户单击submit时,我希望这些日期绑定到我的ViewModel中的IList MyDates属性。有人能告诉我为什么不是这样吗?此外,如果有更好的方法来做这样的事情,请让我知道
下面是我的JavaScript函数的外观,它正在工作。。。它处理向用户显示日期以及另外创建隐藏的提交输入字段。还有更好的办法吗
function refreshDates() {
var dateListHtml = "";
var baselineDatesHtml = "";
for (var i = 0; i < dates.length; ++i) {
dateListHtml = dateListHtml + dates[i].toLocaleDateString() + ' <i onclick="removeDate(' + i + ')" class="fa fa-minus-circle pull-right" style="cursor: pointer;"></i></span>' + '<br>';
baselineDatesHtml = baselineDatesHtml + '<input asp-for="MyDates" type="hidden" name="MyDates" id="MyDates" value="' + dates[i].toLocaleDateString() + '" />';
}
$("#dateList").html(dateListHtml);
$('#myDates').html(baselineDatesHtml);
}
为了使模型绑定工作,表单元素的名称应该和视图模型属性名称/层次结构匹配。因此,如果您正在执行常规表单提交,最好是向表单添加一个新的表单元素(隐藏元素)并将值存储在其中。只要name属性值与视图模型属性名称匹配,模型绑定就可以简单地工作 假设您有这样一个视图模型
public class CreatePost
{
public IList<DateTime> MyDates { set; get; }
//Some other properties for the view
}
现在,当您提交表单时,模型绑定将正确地将发布的表单数据映射到action方法参数,假设该参数的类型为CreatePost
为了使模型绑定工作,表单元素的名称应该和视图模型属性名称/层次结构匹配。因此,如果您正在执行常规表单提交,最好是向表单添加一个新的表单元素(隐藏元素)并将值存储在其中。只要name属性值与视图模型属性名称匹配,模型绑定就可以简单地工作 假设您有这样一个视图模型
public class CreatePost
{
public IList<DateTime> MyDates { set; get; }
//Some other properties for the view
}
现在,当您提交表单时,模型绑定将正确地将发布的表单数据映射到action方法参数,假设该参数的类型为CreatePost
用户可以选择的日期数,您知道吗?是n吗?您在UI中如何处理它?多个输入字段?我在屏幕上有一个日历。当用户单击日历上的日期时,该值将添加到JavaScript数组中。我正在使用Kendo UI for MVC Calendar小部件以及自定义JavaScript来创建用户选择的日期数组。您是在执行ajax表单post还是正常表单提交?正常表单提交到控制器。MVC绑定机制失败,因为它或者期望输入元素和myDates变量之间存在1-1映射,或者无法解析填充到值属性中的stringify值。我会将服务器端的myDates字段设置为字符串类型,并在服务器上对其进行解析。用户可以选择的日期数,您知道吗?是n吗?您在UI中如何处理它?多个输入字段?我在屏幕上有一个日历。当用户单击日历上的日期时,该值将添加到JavaScript数组中。我正在使用Kendo UI for MVC Calendar小部件以及自定义JavaScript来创建用户选择的日期数组。您是在执行ajax表单post还是正常表单提交?正常表单提交到控制器。MVC绑定机制失败,因为它或者期望输入元素和myDates变量之间存在1-1映射,或者无法解析填充到值属性中的stringify值。我会将服务器端的myDates字段设置为字符串类型,并在服务器上对其进行解析。这是正确的吗?是的。这样,您就不需要重写表单提交行为。模型绑定可以很好地工作。我不知道你的示例是一个addFunction,所以每次用户单击add时,你都会在表单中添加一个隐藏的输入字段。我明白了!你能看看我更新的JavaScript,让我知道它是否有意义,因为它正在工作。我只是想确定没有更简单的方法。我明白了。我看错了。对不起。感谢所有的帮助和完美的答案。啊,你是说数组中的每个日期都需要创建一个隐藏的输入字段。这是正确的吗?是的。这样,您就不需要重写表单提交行为。模型绑定可以很好地工作。我不知道你的示例是一个addFunction,所以每次用户单击add时,你都会在表单中添加一个隐藏的输入字段。我明白了!你能看看我更新的JavaScript,让我知道它是否有意义,因为它正在工作。我只是想确定没有更简单的方法。我明白了。我看错了。对不起。感谢所有的帮助和完美的答案。
$(function(){
$("#addBtn").click(function(e){
e.preventDefault();
addHiddenDate($("#DateInputField").val());
});
});
[HttpPost]
public ActionResult Create(CreatePost model)
{
// check model.MyDates
// to do : Return something
}