2017-09-14 1 views
0

Bonsoir à tous, j'espère, tout le monde peut m'aider avec le filtre de la plage horaire sur la partie vue. Voici mon modèle:Fonctionnalité de filtre de recherche de plage de dates dans 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; 
    } 
} 

J'utilise des modèles d'affichage pour l'affichage, est maintenant ici mon contrôleur:

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

     return View(rangeData); 
    } 

Maintenant, j'ai quelques problèmes avec vue ainsi que dans le contrôleur.

Voici ma question: Comment transmettre la date de début et de fin au contrôleur pour obtenir des commandes avec des propriétés définies? Voici ma vue et ce que je fais mal?

<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

Pourquoi avez-vous 2 formulaires séparés et la méthode du 2ème contrôleur. Tous vos contrôles devraient être dans une forme et poster à la première méthode. Et ne vous créez pas d'entrées comme ça. Utilisez une vue modèles avec ces propriétés ('SearchBy',' StartDate' etc. et avec une propriété 'List ' pour la collection filtrée –

+0

Pouvez-vous s'il vous plaît afficher cela par code dans le contrôleur et afficher –

+0

quel est le problème exact que vous avez en vue et contrôleur? – Ravi

Répondre

0

Fournir un attribut d'espace réservé à vos champs d'entrée pour guider l'utilisateur sur le format de date prévue est une option que vous pouvez utiliser, car cela semble être un des problèmes de format de date. Une autre option consiste à utiliser un sélecteur de date qui définira automatiquement la date dans le bon format.

Cependant, si vous voulez donner à vos utilisateurs la flexibilité à ce jour d'entrée dans le format de leur choix avec un séparateur comprenant «/», « - » ou tout simplement l'espace, voici quelques astuce

 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

Affichage des informations comme "Affichage du résultat pour" Sélectionner la période "permettra à l'utilisateur de voir la date capturée dans le serveur puisque cette solution pourrait conflit mois et jour où le jour est inférieur ou égal à 12 – codein