Редактирование даты и времени переменных-членов с DropDownListFor не сохраняет - PullRequest
0 голосов
/ 01 июня 2011

Итак, я пытаюсь создать DropDownList, который будет редактировать различные переменные-члены класса DateTime (которые у меня есть в моей модели), такие как День, Месяц и Год. Однако, когда элемент выбран в DropDownList и нажата кнопка ввода Save, данные не сохраняются. Все остальные отредактированные фрагменты данных будут изменены и сохранены, но поле DateTime просто не обновится. Я бы предпочел не делать новую модель только для моих дат, но это можно сделать. Я могу создать SelectList, я делаю это в HTML Helper, как показано ниже:

namespace ErrorReport.Helpers
{
public class DateList
{
    public static IEnumerable<SelectListItem> DayList
    {
        get
        {
            var days = new List<SelectListItem>();
            for (int i = 1; i < 32; i++)
            {
                days.Add(new SelectListItem
                {
                    Value = i.ToString(),
                    Text = i.ToString()
                });
            }
            return days;
        }
    }

Очевидно, что есть еще два списка, один для Года и один для Месяца (я не беспокоюсь о часах, минутах или секундах), не показывал их, так как код идентичен. В моем View код моего редактора выглядит следующим образом, и переменная, которую я хочу изменить, - CmpD (из DateTime класса):

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" 
        type="text/javascript"></script>

<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"
        type="text/javascript"></script>

@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
    <legend>Edit Report: "@Model.Title"</legend>

    @Html.HiddenFor(model => model.ReportId)
    @Html.HiddenFor(model => model.SbmD)
    @Html.HiddenFor(model => model.UserName)
    @Html.HiddenFor(model => model.CmpD)

    ...irrelevant editor code...

    <div class="editor-label">
        @Html.LabelFor(model => model.CmpD, "Estimated Completion Date:")
    </div>

    <div class="editor-field">  

        @Html.DropDownListFor(model => model.CmpD.Month, DateList.MonthList)
        @Html.DropDownListFor(model => model.CmpD.Day, DateList.DayList)
        @Html.DropDownListFor(model => model.CmpD.Year, DateList.YearList)

        //@Html.ValidationMessageFor(model => model.CmpD.Month)
        //Above line was commented out
    </div>
    <p>
        <input type="submit" value="Save"/>
    </p>
</fieldset>
}

У меня уже была валидация для CmpD's переменных-членов ранее (только те, которые я хотел изменить), закомментировал их, потому что они продолжали выдавать ошибки валидации для каждого возможного SelectList выбора (отмеченного в приведенном выше коде). Я не помещал аргументы в функцию BeginForm, потому что они вызывали проблемы сохранения при сохранении других данных. Я также добавил поле HiddenFor для CmpD (что является моим DateTime), чтобы получить все для правильного сохранения, поскольку без этой строки кода контроллер возврата не распознал Model as valid и не сохранил его. Я попытался добавить поле HiddenFor для каждой переменной-члена в классе DateTime, который я не использую, и все равно получаю ошибки проверки, если удаляю HiddenFor(model => model.CmpD), даже с другими Hidden Fields присутствующими , Я также попытался составить список следующим образом:

    public static IEnumerable<int> YearList
    {
        get
        {
            var years = new List<int>();
            for (int i = 0; i < 4; i++)
            {
                years.Add(i);
            }
            return years.AsEnumerable();
        }
    }

Тем не менее, это предотвращает работу функции Html.DropDownListFor, она, очевидно, должна использовать SelectList items. Я заметил, что только strings может быть SelectList items, и что DateTime переменные-члены ints. Это вызывает проблему? Потому что я не вижу, где они преобразуются в ints, и не могу понять, как бы я это сделал. Как мне отредактировать DateTime member variables в DropDownList?

Кроме того: это слишком много встроенного кода? Заранее спасибо!

1 Ответ

0 голосов
/ 01 июня 2011

Свойства DateTime (День, Месяц и т. Д.) Доступны только для чтения.Следовательно, невозможно установить их для экземпляра DateTime.Вам понадобятся настраиваемые свойства int в вашей модели, чтобы иметь возможность обновлять значения из раскрывающихся списков.Затем вы можете построить DateTime из этих значений позже.Вероятно, я бы создал отдельный класс модели именно для этой цели и реализовал бы редактор даты в виде отдельного шаблона редактора или частичного представления, которое обрабатывает все детали (чтобы ваш код был чистым).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...