2012-02-10 13 views
2

レポートにテキストボックス(日付)とボタンを追加してデータをフィルタリングします。剃刀ビューの検索入力/テキストボックスの日付検証MVC

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

誰かが私を助けてくれますか? テキストボックスに有効な日付が入力されていることを確認するにはどうすればよいですか? この入力用の日付フィールドを持つ別のモデルを作成する必要がありますか?

答えて

0

@Sharkシャークに正しい方向に私を指摘:ような何かをしている、あなたのビューで

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

ビューモデルを使用すると、これは現在動作している最終結果です。 JSの検証も追加されました。

(DrViewModelがのviewmodelあるのでDBSetは必要ありませんでした。)

コントローラ:

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) 

    } 
3

ので、同じように、あなたのモデルでDataAnnotations名前空間からDataTypeAttributeを活用:

@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

こんにちはシャー​​ク。私の入力ボックスは現在、ReportDateを直接参照していません。テキストボックスを使用して、SearchDateStringという文字列をコントローラーに渡します。コントローラーはDateに変換します。 SearchDateString入力を検証するにはどうすればよいですか? –

+0

@DavidSmit私の編集を参照してください。 'TextBoxFor'ヘルパーを使用してモデルに直接プッシュします。あなたの妥当性検査はそこで行われます。 –

+0

ハイシャーク モデルは、リストであるため、IEnumerableとして宣言されています。あなたの提案を追加すると、エラーが発生します: ** System.Collections.Generic.IEnumerable 'には、' ReportDate 'の定義が含まれておらず、最初の引数を受け入れる拡張メソッド' ReportDate 'もありません** –