مرجع تخصصی برنامه نویسان

بزرگترین انجمن برنامه نویسان فارسی زبان

جستجو در جدول براساس فیلد تاریخ

پنج شنبه, 30 خرداد 1398 13:26

جستجو در جدول براساس فیلد تاریخ

با سلام . من در پروژه ام از تتقویم شمسی استفاده کردم که در بانک میلادی ذخیره میشود . برای جستجو براساس تاریخ در فرم جستجو از کد زیر استفاده کرده ام :

 <script type="text/javascript">

        $(function showvalue1()

        {
           $(".datepicker").datepicker();
           $(".datepicker").datepicker({ dateFormat: 'yyyy.mm.dd', altFormat: 'yyyy.mm.dd'});

          var dateTime = $('.datepicker').datepicker('getDate');
          var dateTime = new Date($(".datepicker").datepicker("getDate"));
          var strDateTime = dateTime.getFullYear() + "/" + (dateTime.getMonth() + 1) + "/" + dateTime.getDate();
          var filter = { date: strDateTime };

          $.ajax
           ({
           type: "post",
           dataType: "json",
           data: filter

           });
            url: "@Url.Action("search32", "entities")";
           });
    </script>
   
   
</head>
<body>


    <div class="form-group">

        <div class="col-md-10">

            @{ Html.BeginForm("search32", "entities", FormMethod.Get); }
           
         تاریخ را انتخاب نمایید   @Html.TextBoxFor(model => model.date, new { @id = "txtDate",onclick = "PersianDatePicker.Show(this, '1398/03/13')" ,@class= "datepicker" })
         
            <input type='submit' value='جستجو بر اساس تاریخ' name="date" />
            @{ Html.EndForm(); }
        </div>
    </div>
        
   <input type="text" />
          <script src="~/Scripts/PersianDatePicker.js"></script>  
   
</body>

در کنترلر :

   static DateTime showvalue1(string filter)

        {
                 string persianDateString = "filter";
            string[] persianDateParts = persianDateString.Split('/');
            int persianYear = int.Parse(persianDateParts[0]);
            int persianMonth = int.Parse(persianDateParts[1]);
            int persianDay = int.Parse(persianDateParts[2]);
            PersianCalendar pc = new PersianCalendar();
            DateTime date = new DateTime(persianYear, persianMonth, persianDay, pc);
                  return date;
        }

 public ActionResult search31(DateTime  date)
}
                           
             if (date!=null)
       
           {
                             entity = entity.Where(m => m.date == date);
                return View(entity);
           }

           else
           {
               return RedirectToAction("searchtest");
            }
           return View(entity);
      
         {
      

این کد ارور می دهد یا خالی نشان میدهد در حالیکه جدولم پر است . ولی وقتی کد

  System.Globalization.PersianCalendar x = new System.Globalization.PersianCalendar();

             DateTime dt = x.ToDateTime(1398, 3, 28, 0, 0, 0, 0, 0);

استفاده کردم در کنترلر جواب درست را نشان داده است . اکنون سوالم اینست که چگونه بجای اینکه بصورت دستی تاریخ را تنظیم کنم ، کاربر از تقویم شمسی در فرم جستجو تاریخ را انتخاب و براساس آن تاریخ در بانکم جستجو کند ؟ (به جای 1398و3و28و0و0و0و0) کاربر تاریخ را انتخاب نماید .

پنج شنبه, 30 خرداد 1398 15:46

با سلام خدمت شما

برای جستجو بر اساس تاریخ ، میتونین تاریخ شمسی رو از کاربر با استفاده از DatePicker بگیرین و با استفاده از متد زیر ، تاریخ دریافت شده رو به میلادی تبدیل کنین و بر اساس اون جستجو کنین

public static DateTime ToMiladiDateTime(this string ts)
        {
            var spliteDate = ts.GetEnglishNumbers().Split('/');
            try
            {
                int year = int.Parse(spliteDate[0]);
                int month = int.Parse(spliteDate[1]);
                int day = int.Parse(spliteDate[2]);
                DateTime currentDate = new DateTime(year, month, day, new PersianCalendar());
                return currentDate;
            }
            catch (Exception e)
            {
                return new DateTime();
            }

        }

شنبه, 01 تیر 1398 08:51

با سلام و تشکر از پاسختون . قسمت GetEnglishNumber  دارای ارور در کنترلر من می باشد . باید تابع GetEnglishNumber  را به کد کنترلم اضافه کنم ؟

شنبه, 01 تیر 1398 08:54

با سلام خدمت شما

عذر میخوام فراموش کردم این متد رو قرار بدم

public static string GetEnglishNumbers(this string s)
        {
            return s.Replace("۰", "0").Replace("۱", "1").Replace("۲", "2").Replace("۳", "3").Replace("۴", "4").Replace("۵", "5").Replace("۶", "6").Replace("۷", "7").Replace("۸", "8").Replace("۹", "9");
        }

شنبه, 01 تیر 1398 09:54

من کد رو نوشتم . میتونم کامل کدمو براتون بفرستم . لطفا ببینید مشکل کجاست ؟چطوری میتونم خط به خط کدم رو تست کنم  برای اینکه ببینم کدام خط از کد خروجی نداره ؟

شنبه, 01 تیر 1398 10:09

این مشکل شما رو من هم داشتم و با این روش کنترل شد

دیتای شما به controller ارسال میشه؟

شنبه, 01 تیر 1398 10:11

در کد کنترلم انگار ورودی نداره که خروجی رو برام خالی میفرسته .

 public string  GetEnglishNumbers(string filter)

       {
           

          return filter.Replace("۰", "0").Replace("۱", "1").Replace("۲", "2").Replace("۳", "3").Replace("۴", "4").Replace("۵", "5").Replace("۶", "6").Replace("۷", "7").Replace("۸", "8").Replace("۹", "9"); 
       }
        

        public DateTime showvalue1(string filter)

        {

             var spliteDate = GetEnglishNumbers(filter).Split('/');


            try

            {
                int year = int.Parse(spliteDate[0]);
                int month = int.Parse(spliteDate[1]);
                int day = int.Parse(spliteDate[2]);
                DateTime currentDate = new DateTime(year, month, day, new PersianCalendar());
                return currentDate;
            }


             catch (Exception e)

            {

                return new DateTime();

            }

        }

شنبه, 01 تیر 1398 10:12
 public ActionResult search32(DateTime date)

        {



           //    System.Globalization.PersianCalendar x = new System.Globalization.PersianCalendar();
           //  DateTime dt = x.ToDateTime(1398, 3, 28, 0, 0, 0, 0, 0);

         //   DateTime dt = x.ToDateTime(date);
           DateTime dt = date;

            var entity = from m in db.Notes select m;



            entity = entity.Where(m => m.date == dt);



            return View(entity);

            // return View();

        }

شنبه, 01 تیر 1398 10:14

وقتی توی کنترلم ، اون قسمت بالا که با // جدا کردم استفاده می کنم دقیق محتویات بانک رو نشون میده . ولی با بقیه خالی نشون میده .

شنبه, 01 تیر 1398 10:22

قبل از اینکه کدهای دیگه رو بنویسم . دیتایی که از فرم جستجو با datepicker  ارسال کردم رو توی یک texbox چک کردم . دیدم تاریخی که از تقویم انتخاب میشه ، درست به همان صورت به کنترلر ارسال میشه و در text box  دیگری نشان داده میشه . ولی نمیدونستم چطوری باید در جدول که میلادی ذخیره شده جستجو کرد ؟! که شما زحمت کشیدید ولی خالی نشون میده .

شنبه, 01 تیر 1398 10:26

 

 public DateTime showvalue2(string filter)

        }
 TempData["date"] = filter;


{

 public ActionResult search31(entity entity)
    }

 ViewBag.data = TempData["date"];
{

با این کد من خروجی datepicker  رو تست کردم که توی textbox میگذارد .

شنبه, 01 تیر 1398 10:27

شاید بخاطر اینکه در action resault 31(entity entity)  که مربوط به مدل هست قرارداده میشه ! 

شنبه, 01 تیر 1398 10:33

متد showValue1 که براتون ارسال کردم رو استفاده نکردین که

ببینین ، دیتای ورودی شما که همون filter هستش رو باید با استفاده از اون extension method هایی که براتون ارسال کردم به تاریخ میلادی تبدیل کنین

به این صورت که اول از متد تبدیل اعداد استفاده میکنین و بعدش از متد تبدیل

شنبه, 01 تیر 1398 10:42

یعنی هرو تا تابع باید ورودیشون filter باشه  ؟

شنبه, 01 تیر 1398 10:46

یعنی هرو تا تابع باید ورودیشون filter باشه  ؟

وقتی از کدهای داده شما استفاده می کنم ، دوتا ارور میده در بخش کنترلر قبل از اجرا .یکی روی GetEnglishNumbers ، ویکی رووی  public class entitiesController : Controller  ? !برای ارور دوم میگه :

extension method must be defined in a non-generic static class

شنبه, 01 تیر 1398 10:46

بله

ببینین اول باید فرمت اعداد رو در اون filter اصلاح کنین که با متد تبدیل اعداد اوکی میشه

بعدش باید از متد تبدیل تاریخ استفاده کنین تا تاریخ شما رو که به صورت یک رشته هستش به DateTime تبدیل کنه

شنبه, 01 تیر 1398 10:52

سوال بعدی: موقعی که از کد return filter.Replace("۰", "0").Replace("۱", "1").Replace("۲", "2").Replace("۳", "3").Replace("۴", "4").Replace("۵", "5").Replace("۶", "6").Replace("۷", "7").Replace("۸", "8").Replace("۹", "9");  استفاده می کنم همه اعداد رو فارسی میزنه .روی en  هم میذارم فارسی تایپ میشه!

شنبه, 01 تیر 1398 10:54

ببخشید میتونید به سیستمم ریموت بشید ؟

شنبه, 01 تیر 1398 11:05

ببخشید میشه به سیستمم  با any desk  وصل بشوید ؟

شنبه, 01 تیر 1398 11:40
شنبه, 01 تیر 1398 11:48

ممنونم . سعی می کنم . بسیار زحمت کشیدید .

شنبه, 01 تیر 1398 11:48

خواهش میکنم دوست من

موفق باشین :)

ﺳﻪ شنبه, 04 تیر 1398 08:23

سلام . اشکالم حل شد .

ازکلاس  persiandatemodelbinder در پروژه استفاده کردم . اون متدهای بالا که برام فرستادید در کلاس هست . در ویو از datepicker  استفاده کردم . در نهایت برای خروجی در کنترلر فقط شرط خالی نبودن date گذاشته شد .

مشکلم ارتباط کلاس binder  با فرمم بود .

با تشکر از شما که وقت گذاشتید .

ارسال پاسخ برای این تاپیک

ارسال پاسخ مخصوص اعضا سایت می باشد ! میتوانید با حساب کاربری خود وارد سایت شده یا ثبت نام کنید