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

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

کاربر سایت

aabedeni

عضویت از 1398/03/30

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

  • پنجشنبه 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) کاربر تاریخ را انتخاب نماید .

پاسخ های این پرسش

تعداد پاسخ ها : 22 پاسخ
کاربر سایت

محمد اردوخانی

عضویت از 1396/05/17

  • پنجشنبه 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();
            }

        }

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 1398
  • 08:51

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

کاربر سایت

محمد اردوخانی

عضویت از 1396/05/17

  • شنبه 1 تیر 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");
        }

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 1398
  • 09:54

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

کاربر سایت

محمد اردوخانی

عضویت از 1396/05/17

  • شنبه 1 تیر 1398
  • 10:09

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

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

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 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();

            }

        }

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 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();

        }

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 1398
  • 10:14

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

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 1398
  • 10:22

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

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 1398
  • 10:26

 

 public DateTime showvalue2(string filter)

        }
 TempData["date"] = filter;


{

 public ActionResult search31(entity entity)
    }

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

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

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 1398
  • 10:27

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

کاربر سایت

محمد اردوخانی

عضویت از 1396/05/17

  • شنبه 1 تیر 1398
  • 10:33

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

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

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

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 1398
  • 10:42

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

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 1398
  • 10:46

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

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

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

کاربر سایت

محمد اردوخانی

عضویت از 1396/05/17

  • شنبه 1 تیر 1398
  • 10:46

بله

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

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

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 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  هم میذارم فارسی تایپ میشه!

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 1398
  • 10:54

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

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 1398
  • 11:05

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

کاربر سایت

محمد اردوخانی

عضویت از 1396/05/17

  • شنبه 1 تیر 1398
  • 11:40

متاسفانه امکان این مسئله وجود ندارد

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

https://stackoverflow.com/questions/18340808/how-to-convert-persian-digits-in-variable-to-english-digits-using-culture

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • شنبه 1 تیر 1398
  • 11:48

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

کاربر سایت

محمد اردوخانی

عضویت از 1396/05/17

  • شنبه 1 تیر 1398
  • 11:48

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

موفق باشین :)

کاربر سایت

aabedeni

عضویت از 1398/03/30

  • سه شنبه 4 تیر 1398
  • 08:23

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

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

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

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

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)