【问题标题】:Textboxfor mvc3 date formatting and date validation用于 mvc3 日期格式和日期验证的文本框
【发布时间】:2011-06-29 08:48:28
【问题描述】:

我决定开始使用 MVC 3,但在尝试将我的一个 Web 应用程序重做为 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。 所以首先:如何将日期格式化为短日期字符串? 我找到了一个MVC2 solution,它建议在 SharedFolder 中创建一个 EditorTemplates 文件夹并改用 EditorFor ,但这似乎不适用于 MVC3 。它似乎也可以防止像使用 TextBoxFor 那样轻松添加类

其次,一旦解决了这个问题,我就需要建立一个特殊的验证系统。我需要让结束日期在开始日期之后。我正在考虑使用我找到的 http://www.datejs.com 的 javascript 进行检查,但有没有办法直接在我的班级上进行验证?

【问题讨论】:

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


    【解决方案1】:

    为您的编辑模板试试这个

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

    来源:MVC 3 Editor Template with DateTime

    jQuery 日期时间比较

    $('#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

    【讨论】:

    • 感谢您的链接!我的日期仍然显示 01/01/001。但我想我可以用 jquery 重写它。
    • 这可能是一个愚蠢的问题,但日期是否在发送到视图之前填充?
    • 我不明白他们会怎样。我的 HomeController 非常简单:public PartialViewResult EntryForm() { ViewBag.Teams = projectDB.Teams.OrderBy(p =&gt; p.Name).ToList(); var project = new Project(); return PartialView(project); }
    • 尝试将 Date 设置为可空类型,否则会自动实例化为系统默认的 1/1/0001。 dotnetperls.com/datetime-minvalue
    【解决方案2】:

    有一种相当简单的方法可以做到这一点。只需使用TextBox 而不是TextBoxFor

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

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

    【讨论】:

      【解决方案3】:

      看看这个例子

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

      【讨论】:

      • 这是一个小解决方法!它创造了第二个价值属性。它仅在使用大写字母 V 时才有效。
      【解决方案4】:

      如果您使用以下内容装饰您的视图模型对象,您将只能在文本框中看到日期部分。

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

      然后在您的页面上您可以简单地执行以下操作

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

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

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

      【讨论】:

        【解决方案5】:

        为时已晚,但可能对某人有帮助:

        型号:

        [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});
        

        【讨论】:

          【解决方案6】:

          // datePicker 中显示的 datimetime 是 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>
          

          希望这会有所帮助..

          【讨论】:

            猜你喜欢
            • 2011-12-24
            • 2012-08-06
            • 1970-01-01
            • 2013-02-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-04
            • 1970-01-01
            相关资源
            最近更新 更多