У меня возникли проблемы с получением связующего по умолчанию MVC для сериализации вложенного объекта. Я провел немало исследований, чтобы попытаться выяснить, что я делаю неправильно, но я этого не вижу.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>
Соответствующая часть генерируемой HTML:
<input name="Start_DatePart" id="Start_DatePart" class="text-box single-line form-control datepicker" type="text" value="2015-02-22">
<input name="Start_TimePart" id="Start_TimePart" class="text-box single-line form-control datepicker" type="text" value="0001-01-01">
<input name="End_DatePart" id="End_DatePart" class="text-box single-line form-control datepicker" type="text" value="2015-03-01">
<input name="End_TimePart" id="End_TimePart" class="text-box single-line form-control datepicker" type="text" value="0001-01-01">
И, наконец, модель. Я включил все, так как я не уверен, что вызывает вопрос:
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);
}
}
}
Не уверен в вашей реальной проблеме, но зачем вам нужен класс под названием 'DateTimeParts', .net' DateTime' уже обрабатывает даты и время. – Matthew
опубликуйте свой класс startEndTime также –
Предположим, что у вас есть опечатки в html - это будет 'name =" Start.DatePart "' (не 'name =" Start_DatePart "') и т. Д. –