textboxfor mvc3日期格式和日期验证

时间:2011-02-17 19:58:48

标签: .net asp.net-mvc asp.net-mvc-3

我决定开始使用MVC 3,并且在尝试将我的一个网络应用程序重做为MVC3时遇到了这个问题。

我已经通过这种方式设置了项目:

public class Project
{
    public int      ProjectID       { get; set; }

    [Required(ErrorMessage="A name is required")]
    public string   Name            { get; set; }

    [DisplayName("Team")]
    [Required(ErrorMessage="A team is required")]
    public int      TeamId          { get; set; }

    [DisplayName("Start Date")]
    [Required(ErrorMessage="A Start Date is required")]
    [DisplayFormat(ApplyFormatInEditMode=true, DataFormatString="{0:d}")]
    public DateTime StartDate       { get; set; }

    [DisplayName("End Date")]
    [Required(ErrorMessage="An End Date is required")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
    public DateTime EndDate         { get; set; }
}

我的报名表是以这种方式写的日期:

<table>
    <tr>
        <td>
            <div class="editor-label">
                @Html.LabelFor(model => model.StartDate)
            </div>
        </td>
        <td>
            <div class="editor-label">
                @Html.LabelFor(model => model.EndDate)
            </div>
        </td>
    </tr>
    <tr>
        <td>
            <div class="editor-field">
                @Html.TextBoxFor(model => model.StartDate, new { @class = "datepicker", id="txtStartDate" })
                @Html.ValidationMessageFor(model => model.StartDate)
            </div>
        </td>
        <td>
            <div class="editor-field">
                @Html.TextBoxFor(model => model.EndDate, new { @class = "datepicker", id = "txtEndDate" })
                @Html.ValidationMessageFor(model => model.EndDate)
            </div>
        </td>
    </tr>
</table>

我的问题是文本框现在显示01 / Jan / 0001 00:00:00。 首先:我怎样才能将日期格式化为shortdatestring? 我发现MVC2 solution建议在SharedFolder中创建一个EditorTemplates文件夹并使用EditorFor,但这似乎不适用于MVC3。它似乎也阻止了像TextBoxFor

那样容易地添加类

其次,一旦修复,我就有了一个特殊的验证系统,我需要将其安装到位。我需要将结束日期设置为开始日期之后。我正在考虑使用我发现的http://www.datejs.com的javascript进行检查,但有没有办法直接在我的班级进行验证?

6 个答案:

答案 0 :(得分:8)

对于您的编辑模板,请尝试此

@model DateTime?
@Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" })

来源:MVC 3 Editor Template with DateTime

jQuery DateTime比较

$('#txtbox').change(function() {
            var date = $(this).val();
            var arrDate = date.split("/");
            var today = new Date();
            useDate = new Date(arrDate[2], arrDate[1] -1, arrDate[0]);

            if (useDate > today) {
                alert('Please Enter the correctDate');
                $(this).val('');
            }
        });

来源:Jquery date comparison

答案 1 :(得分:6)

有一种相当简单的方法。只需使用TextBox而不是TextBoxFor

@Html.TextBox("ReturnDepartureDate", 
    Model.ReturnDepartureDate.ToString("dd/MM/yyyy"))

这样做的好处是可以添加所有不显眼的JavaScript元素等。还有更少的代码!

答案 2 :(得分:3)

看一下这个例子

@Html.TextBoxFor(s => s.dateofbirth, new { Value = @Model.dateofbirth.ToString("dd/MM/yyyy") })

答案 3 :(得分:2)

如果使用以下内容装饰viewmodel对象,则只会在文本框中看到日期部分。

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime Date { get; set; }

然后在您的页面上,您只需执行以下操作

@Html.EditorFor(model => model.Date)

请注意,这是使用标准MVC3。我没有自定义日期编辑器模板。

此答案的所有功劳归于assign date format with data annotations

答案 4 :(得分:0)

// datimetime显示在datePicker是11/24/2011 12:00:00 AM

//您可以按空格拆分并将值设置为仅日期

脚本:

    if ($("#StartDate").val() != '') {
        var arrDate = $('#StartDate').val().split(" ");
        $('#StartDate').val(arrDate[0]);
    }

标记:

    <div class="editor-field">
        @Html.LabelFor(model => model.StartDate, "Start Date")
        @Html.TextBoxFor(model => model.StartDate, new { @class = "date-picker-needed" })
    </div>

希望这会有所帮助..

答案 5 :(得分:0)

太晚了但可能对某人有帮助:

型号:

[Display(Name = "Date of birth")]
public DateTime? DOB{ get; set; }

HTML:

@Html.TextBoxFor(m => m.DOB, "{0:MM/dd/yyyy}", 
          new { @placeholder="MM/DD/YYYY", @au19tocomplete="off" }) 

JavaScript将日历添加到控件中:

$('#DOB').datepicker({changeMonth: true, changeYear: true, 
         minDate: '01/01/1900',  maxDate: new Date});