Проверка даты в поиске / текстовое поле для бритвы MVC - PullRequest
2 голосов
/ 10 февраля 2012

Я хотел бы добавить текстовое поле (дата) и кнопку в мой отчет, который фильтрует данные.

Работает приведенный ниже mvc, но входные данные должны быть проверены (должны быть ДАТА) на стороне клиента (и, если возможно, на стороне сервера)

Моя модель выглядит следующим образом:

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

Может кто-нибудь помочь мне, пожалуйста?Как убедиться, что в текстовое поле введена правильная дата?Должен ли я создать другую модель с полем даты для этого ввода?

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

Используйте DataTypeAttribute из пространства имен DataAnnotations в вашей модели, например:

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)
}
0 голосов
/ 13 февраля 2012

@ Акула Акула указала мне в правильном направлении, чтобы использовать модель представления, это конечный результат, который сейчас работает. Также добавлена ​​проверка 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)

    }
...