【问题标题】:Date validation on search input/textbox for a razor view MVC剃刀视图 MVC 的搜索输入/文本框上的日期验证
【发布时间】:2012-02-10 13:25:46
【问题描述】:

我想在我的报告中添加一个文本框(日期)和按钮,用于过滤数据。

下面的 mvc 正在工作,但输入仍必须在客户端(如果可能,服务器端)验证(必须是 DATE)

我的模型如下所示:

public class DailyReport
{    
    public int DailyReportID { get; set; }
    public DateTime? ReportDate { get; set; }
}

查看:

@model IEnumerable<project_name.Models.DailyReport>
@* text box and button:  *@
@using (Html.BeginForm("Index", "DailyReport", FormMethod.Get))
{   <p>
     Title: @Html.TextBox("SearchDateString")
     <input type="submit" value="Filter" />
     </p>
}
@* display dates*@
@foreach (var item in Model)
{       @Html.DisplayFor(modelItem => item.ReportDate)
}

我的控制器:

   public ViewResult Index(String SearchDateString)
    {
        var dailyreport = db.DailyReport.Include(d => d.Site);

        if (!String.IsNullOrEmpty(SearchDateString))
        {
            DateTime search_date = Convert.ToDateTime(SearchDateString);
            dailyreport = dailyreport.Where(r => r.ReportDate == search_date);
        }
        return View(dailyreport.ToList());
    }

有人可以帮帮我吗? 如何确保在文本框中输入了有效日期? 我应该为此输入创建另一个带有日期字段的模型吗?

【问题讨论】:

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


    【解决方案1】:

    在模型中使用 DataAnnotations 命名空间中的 DataTypeAttribute,如下所示:

    public class DailyReport
    {    
        public int DailyReportID { get; set; }
        public DateTime? ReportDate { get; set; }
    }
    
    public class DrViewModel
    {
        [DataType(DataType.Date)]
        public string DateTimeSearch { get; set; }
        List<DailyReport> DailyReports { get; set; }
    }
    

    在你的视图中,有类似的东西:

    @model project_name.Models.DrViewModel
    
    @using (Html.BeginForm("Index", "DailyReport", FormMethod.Get))
    {   
         <p>
         Title: @Html.TextBoxFor(m => m.DateTimeSearch)
         <input type="submit" value="Filter" />
         </p>
    }
    
    
    @foreach (var item in Model.DailyReports)
    {
        @Html.DisplayFor(m => item.ReportDate)
    }
    

    【讨论】:

    • 嗨鲨鱼。我的输入框当前没有直接引用 ReportDate。它使用文本框将字符串 SearchDateString 传递给控制器​​,控制器将其转换为日期。如何验证 SearchDateString 输入?
    • @DavidSmit 看到我的编辑。使用 TextBoxFor 助手将其推送到模型。您的验证将在那里进行。
    • Hi Shark 在视图中,模型被声明为 IEnumerable,因为它是一个列表。当我添加您的建议时,我收到错误:System.Collections.Generic.IEnumerable' 不包含“ReportDate”的定义,并且没有扩展方法“ReportDate”接受类型的第一个参数
    • @DavidSmit 将您的模型声明从 @model IEnumerable&lt;project_name.Models.DailyReport&gt; 更改为 @model project_name.Models.DailyReport。您收到该错误的原因是您的 ModelIEnumerable&lt;DailyReport&gt; 类型,并且没有直接来自 ReportDate 的属性。您必须更改您的 model 声明或使用该 IEnumerable。
    • 我想它一定是一个IEnumerable,因为我想显示一个DailyReport的列表。错误:CS1579:foreach 语句无法对“project_name.Models.DailyReport”类型的变量进行操作,因为“project_name.Models.DailyReport”不包含“GetEnumerator”的公共定义
    【解决方案2】:

    @Shark Shark 为我指出了使用视图模型的正确方向,这是现在正在工作的最终结果。还添加了 JS 验证。

    (DBSet 不是必需的,因为 DrViewModel 是一个视图模型。)

    控制器:

        public ActionResult Index(DrViewModel dvm)
        {
            var dailyreport = db.DailyReport.Include(d => d.Site);
            if (dvm.DateTimeSearch != null)
            {
                dailyreport = dailyreport.Where(r => r.ReportDate == dvm.DateTimeSearch);
            }
    
            dvm.DailyReport = dailyreport.ToList();
            return View(dvm);
        }
    

    型号:

    public class DrViewModel
    {
        public DateTime? DateTimeSearch { get; set; }
        public List<DailyReport> DailyReport { get; set; }
    }
    
     public class DailyReport
    {
    
        public int DailyReportID { get; set; }
         public DateTime? ReportDate { get; set; }
    }
    

    查看:

    @model myproject.Models.DrViewModel
    
    @{
    ViewBag.Title = "Index";
     }
    
    <h2>Index</h2>
    <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("Index","DailyReport", FormMethod.Get ))
    {   
      @Html.ValidationSummary(true)
    
     <div class="editor-label">
            @Html.LabelFor(model => model.DateTimeSearch)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.DateTimeSearch)
            @Html.ValidationMessageFor(model => model.DateTimeSearch)
        <input type="submit" value="Filter" />
        </div>
    
    }    
       @foreach (var item in Model.DailyReport)
       {
                    @Html.DisplayFor(modelItem => item.ReportDate)
    
        }
    

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多