2015-03-02 2 views
1

У меня возникли проблемы с получением связующего по умолчанию 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); 
     } 
    } 
} 
+2

Не уверен в вашей реальной проблеме, но зачем вам нужен класс под названием 'DateTimeParts', .net' DateTime' уже обрабатывает даты и время. – Matthew

+0

опубликуйте свой класс startEndTime также –

+0

Предположим, что у вас есть опечатки в html - это будет 'name =" Start.DatePart "' (не 'name =" Start_DatePart "') и т. Д. –

ответ

0

Я держал пари, что это путь C# обрабатывает DateTime. Например, 0001-01-01 не похож на действительную дату, и в нем отсутствует отметка времени.

Вы должны сделать это установить value на что-то вроде:

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

Я думаю, что связующий по умолчанию будет забрать его тогда. Используйте @Html.HiddenFor, чтобы проверить это.

+0

Фактически я использую этот формат в других местах с датами, и он отлично работает. –

+0

Спасибо за ваше предложение использования HiddenFor, это помогло мне найти моя проблема, которая оказалась названием поля, как было предложено выше. –

Смежные вопросы