在表单提交时将日期的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="[&quot;2016-02-17T05:00:00.000Z&quot;,&quot;2016-02-16T05:00:00.000Z&quot;,&quot;2016-02-11T05:00:00.000Z&quot;,&quot;2016-02-12T05:00:00.000Z&quot;,&quot;2016-02-19T05:00:00.000Z&quot;]">
当用户单击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
}