C# MVC默认绑定器未绑定嵌套类

C# MVC默认绑定器未绑定嵌套类,c#,asp.net-mvc,model-binding,C#,Asp.net Mvc,Model Binding,让MVC默认绑定器序列化嵌套对象时遇到问题。 我做了很多研究,试图找出我做错了什么,但我没有看到 模型中的所有嵌套对象都是由构造函数创建的,如果没有构造函数,则不会创建任何对象,但不会序列化任何数据 我已经覆盖了DefaultBinder并添加了断点,以找出失败的地方。它似乎将开始和结束识别为DateTimePart,但对它们没有任何作用 我花了很多时间试图阅读和理解DefaultBinder的逻辑,我读到的所有东西似乎都表明这应该是可行的,但它没有。任何帮助或胡乱猜测都将不胜感激,因为这让我发

让MVC默认绑定器序列化嵌套对象时遇到问题。 我做了很多研究,试图找出我做错了什么,但我没有看到

模型中的所有嵌套对象都是由构造函数创建的,如果没有构造函数,则不会创建任何对象,但不会序列化任何数据

我已经覆盖了DefaultBinder并添加了断点,以找出失败的地方。它似乎将开始和结束识别为DateTimePart,但对它们没有任何作用

我花了很多时间试图阅读和理解DefaultBinder的逻辑,我读到的所有东西似乎都表明这应该是可行的,但它没有。任何帮助或胡乱猜测都将不胜感激,因为这让我发疯

另外,为了说明这一点,我意识到我可以使用自定义活页夹来克服这一问题,但在此之前,我想了解为什么默认活页夹不起作用

这是控制器:

public class TestController : Controller
{
    // GET: Test
    public ActionResult Index()
    {
        StartEndTime se = new StartEndTime();
        se.Start = new DateTimeParts();
        se.End = new DateTimeParts();
        se.Start.Date = new DateTime(2015, 2, 22, 13, 12, 0);
        se.End.Date = new DateTime(2015, 3, 1, 10, 43, 0);
        return View(se);
    }

    [HttpPost]
    public ActionResult Index(StartEndTime se)
    {
        return RedirectToAction("Index");
    }
}
这里只是视图示例,它复制了问题,但实际的视图对时间和日期的处理方式不同

@model Models.StartEndTime

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()


    @Html.EditorFor(model => model.Start.DatePart)
    @Html.EditorFor(model => model.Start.TimePart)

    @Html.EditorFor(model => model.End.DatePart)
    @Html.EditorFor(model => model.End.TimePart)

    @Html.SButtonSave()
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

我打赌这就是C处理日期时间的方式。例如,0001-01-01看起来不是有效日期,并且缺少时间戳

您应该将其设置为如下值:

string dateString = "5/1/2008 8:30:52 AM";

我想默认的活页夹会把它捡起来。使用@Html.HiddenFor进行测试。

不确定您的实际问题,但为什么需要名为DateTimeParts的类,net DateTime已经可以处理日期和时间。发布startEndTime类也可以假设html中有一些输入错误-应该是name=Start.DatePart而不是name=Start\u DatePart等。回答注释:1.我希望活页夹将一个字段绑定到日期,另一个绑定到时间。在我的模型中需要这样才能起作用。本可以用两次约会,但那似乎很笨重。2.Startendtime类在上面的帖子中,只需向下滚动即可。3.NET4.5和新的mvc使用下划线而不是点。该名称由microsoft mvc代码生成。谢谢Stephen,您已经找到了答案。我使用自己的自定义编辑器,在名称字段中愚蠢地使用了Id。我的印象是它们总是匹配的,活页夹使用ID字段,但一旦我使用hiddenfor进行测试,我发现名称使用了点。id使用下划线。现在可以了。事实上,我在datetimes的其他地方也使用了这种格式,效果很好。感谢您建议使用HiddenFor,它帮助我找到了我的问题,原来是上面建议的字段名称。
public class DateTimeParts
{
    public DateTime? Date { get; set; }

    public DateTime? DatePart
    {
        get
        {
            if (Date.HasValue)
                return Date.Value.Date;
            else
                return null;
        }
        set
        {
            if (value.HasValue)
            {
                if (Date.HasValue)
                    Date = value.Value.Date.Date + Date.Value.TimeOfDay;
                else
                    Date = value.Value.Date.Date;
            }
            else
            {
                Date = null;
            }
        }
    }

    public DateTime? TimePart
    {
        get
        {
            if (Date.HasValue)
                return new DateTime() + Date.Value.TimeOfDay;
            else
                return null;
        }
        set
        {
            if (value.HasValue)
            {
                if (Date.HasValue)
                    Date = Date.Value.Date + value.Value.TimeOfDay;
                else
                    Date = new DateTime() + value.Value.TimeOfDay;
            }
            else
            {
                Date = new DateTime();
            }
        }
    }
}

public class StartEndTime
{
    public DateTimeParts Start { get; set; }

    public DateTimeParts End { get; set; }

    public int Minutes
    {
        get
        {
            if (!Start.Date.HasValue || !End.Date.HasValue)
                return 0;
            else
                return (int)(End.Date.Value - Start.Date.Value).TotalMinutes;
        }
        set
        {
            if (!Start.Date.HasValue)
                return;
            End.Date = Start.Date.Value + new TimeSpan(0, value, 0);
        }
    }
}
string dateString = "5/1/2008 8:30:52 AM";