2017-09-14 28 views
0

おはようございます、誰でも私の手助けをすることができます。ここに私のモデルである:asp.net mvc 5の日付範囲検索フィルタ機能?

public class Student 
{ 
    public int ID { get; set; } 
    public string StudentName { get; set; } 
    public int CourseId { get; set; } 
    public virtual Course Course { get; set; } 
    public DateTime CurrentDate { get; set; } 
    public Student() 
    { 
     CurrentDate = DateTime.Now; 
    } 
} 

私は今ここに、表示用のビューモデルを使用していますことは、私のコントローラです:

public ActionResult Index(DateTime? startdate, DateTime? enddate) 
    { 
     var rangeData = db.Students.Where(x => x.CurrentDate >= startdate && x.CurrentDate <= enddate).ToList(); 

     return View(rangeData); 
    } 

今私はビューと同様に、コントローラに問題があります。

ここは私の質問です:コントローラに開始日と終了日を渡して、定義されたプロパティで注文を得る方法?ここに私の見解と私が間違っていることは何ですか?予定日の形式にユーザーを導くために、あなたの入力フィールドにplaceholder属性を提供

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 

@using (Html.BeginForm("Index", "Students", FormMethod.Get)) 
{ 
    <fieldset> 
     <legend>Search criteria</legend> 
     @Html.Label("StartDate", "Start Date:") 
     <input class="startdate" id="startdate" name="startdate" type="date" value=""> 
     @Html.Label("enddate", "End Date:") 
     <input class="startdate" id="enddate" name="enddate" type="date" value=""> 
     <input type="submit" value="Apply" /> 
    </fieldset> 
} 


<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.StudentName) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Address) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Gender) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.MobileNo) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Course) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.StudentName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Address) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Gender) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.MobileNo) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Course.CourseName) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | 
      @Html.ActionLink("Details", "Details", new { id=item.ID }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.ID }) 
     </td> 
    </tr> 
} 

</table> 
+0

のはなぜですあなたは2つの別々のフォームと2番目のコントローラメソッドを持っていますか?すべてのコントロールは1つの形式にし、最初の方法に投稿する必要があります。そして、あなたのような入力を作成しないでください。それらのプロパティ( 'SearchBy'、' StartDate'など)を持つビューモデルを使用し、フィルタリングされたコレクションの 'List 'プロパティを使用してください –

+0

コントローラとビューのコードで投稿できますか? –

+0

とコントローラ? – Ravi

答えて

0

がこの日付フォーマットの問題のように思えるので、あなたが使用できる一つの選択肢です。もう一つの選択肢は、自動的に正しい形式で日付を設定する日付選択コントロールを使用することです。

しかし、あなたは「/」を含む任意の区切りで自分の好きな任意の形式で入力日付にユーザーの柔軟性を与えたい場合は、「 - 」または単にスペース、ここにいくつかのヒントが

 public ActionResult Index(string startdate = null, string enddate = null) 
    { 
     if (startdate != null && enddate != null) 
     { 
      //this will default to current date if for whatever reason the date supplied by user did not parse successfully 

      DateTime start = DateManager.GetDate(startdate) ?? DateTime.Now; 

      DateTime end = DateManager.GetDate(enddate) ?? DateTime.Now; 

      var rangeData = db.Students.Where(x => x.CurrentDate >= start && x.CurrentDate <= end).ToList(); 

      return View(rangeData); 
     } 
     return View(); 
    } 


     public class DateManager 
    { 
     /// <summary> 
     /// Use to prevent month from being overritten when day is less than or equal 12 
     /// </summary> 
     static bool IsMonthAssigned { get; set; } 



     public static DateTime? GetDate(string d) 
     { 
      char[] splitsoptions = { '/', '-', ' ' }; 
      foreach (var i in splitsoptions) 
      { 
       var y = 0; 
       var m = 0; 
       var day = 0; 
       if (d.IndexOf(i) > 0) 
       { 
      try{ 
        foreach (var e in d.Split(i)) 
        { 


         if (e.Length == 4) 
         { 
          y = Convert.ToInt32(e); 

          continue; 
         } 
         if (Convert.ToInt32(e) <= 12 && !IsMonthAssigned) 
         { 
          m = Convert.ToInt32(e); 
          IsMonthAssigned = true; 
          continue; 
         } 
         day = Convert.ToInt32(e); 


        } 

        return new DateTime(y, m, day); 
      }catch 
      { 
      //We are silent about this but we could set a message about wrong date input in ViewBag and display to user if this this method returns null 
      } 
       } 
      } 
      return null; 


     } 
    // Another overload. this will catch more date formats without manually checking as above 

    public static DateTime? GetDate(string d, bool custom) 
     { 
      CultureInfo culture = new CultureInfo("en-US"); 

      string[] dateFormats = 
      { 
       "dd/MM/yyyy", "MM/dd/yyyy", "yyyy/MM/dd", "yyyy/dd/MM", "dd-MM-yyyy", "MM-dd-yyyy", "yyyy-MM-dd", 
       "yyyy-dd-MM", "dd MM yyyy", "MM dd yyyy", "yyyy MM dd", "yyyy dd MM", "dd.MM.yyyy", "MM.dd.yyyy", 
       "yyyy.MM.dd", "yyyy.dd.MM","yyyyMMdd","yyyyddMM","MMddyyyy","ddMMyyyy" 
      };//add your own to the array if any 

      culture.DateTimeFormat.SetAllDateTimePatterns(dateFormats, 'Y'); 

      if (DateTime.TryParseExact(d, dateFormats, culture, DateTimeStyles.None, out var date)) 
       return date; 

      return null; 


     } 
    } 
+0

"結果の選択"のような情報を表示すると、この解決策がサーバーでキャプチャされた日付を見ることができます日が12以下の葛藤の月と日 – codein

関連する問題