使用DropDownListFor编辑日期时间成员变量不保存

时间:2011-06-01 16:14:33

标签: c# datetime asp.net-mvc-3 drop-down-menu

所以,我正在尝试创建一个DropDownList,它将编辑DateTime类具有的各种成员变量(我的模型中有一个实例),例如Day,Month和年。但是,如果在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中,我的编辑器代码如下所示,我想要更改的变量是CmpDDateTime类):

<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),以便正确保存所有内容,因为如果没有该行代码,则返回控制器无法识别{{1}并没有保存它。我尝试在我未使用的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可以是stringsSelectList items成员变量是DateTime。这是导致问题吗?因为我看不到他们在ints被重新编写的地方,也无法弄清楚我会怎么做。基本上,如何修改ints中的DateTime member variables

另外:这是太多的内联代码吗?提前谢谢!

1 个答案:

答案 0 :(得分:0)

DateTime属性(日,月等)都是只读的。因此,无法在DateTime实例上设置它们。 您需要在模型中使用可设置的int属性才能更新下拉列表中的值。然后,您可以稍后从这些值构造DateTime。我可能会为此目的创建一个单独的模型类,并将日期编辑器实现为单独的编辑器模板或处理所有细节的部分视图(以保持代码清洁)。