PersianDatePicker یک DatePicker شمسی به زبان JavaScript که از تاریخ سرور استفاده میکند
نویسنده: رحمت اله رضایی
تاریخ: ۱۳۹۲/۰۳/۲۶ ۱۲:۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
طرز استفاده :
PersianDatePicker.Show(textBox, today)
<html>
<head>
<script type="text/javascript" src="Scripts/PersianDatePicker.min.js"></script>
<link type="text/css" rel="stylesheet" href="Content/PersianDatePicker.min.css" />
</head>
<body>
<input type="text" onclick="PersianDatePicker.Show(this, '1392/03/22');" />
</body>
</html> <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication4.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="Scripts/PersianDatePicker.min.js"></script>
<link href="Content/PersianDatePicker.min.css" rel="stylesheet" />
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label runat="server" Text="Label" AssociatedControlID="TextBox1">تاریخ : </asp:Label>
<asp:TextBox runat="server" ID="TextBox1"></asp:TextBox>
</div>
</form>
</body>
</html> public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var now = PersianDateTime.Now;
var today = now.ToString(PersianDateTimeFormat.Date);
TextBox1.Attributes["onclick"] = "PersianDatePicker.Show(this,'" + today + "');";
}
} سلام؛ میخوام بدونم چجوری یه رویداد مثل onclick یه شیء مثل textbox رو تو mvc مدیریت میکنن مثلا نمایش همین datepicker (ناگفته نمونه تا بخش هشتم از آموزش mvc شما رو مطالعه کردم)
بسیار ممنون
@Html.TextBox("DateCreated", "", new { onclick="alert('yes')"} )با سلام و تشکر
از این DataPicker استفاده کردم ولی:
1- به چه صورت از یک دکمه برای نمایش تقویم و نمایش تاریخ انتخابی در TexBox استفاده کنیم
2-در حالت عادی دکمههای برگشت ماه و سال درست نمایش داده نمیشوند و در حالت Compatibility View دکمهها درست دیده میشوند
شما حتی در ویندوز XP هم مجبور نیستی از IE 8 استفاده کنی. فایرفاکس و کروم روی XP راحت نصب میشن
public DateTime deliveryDate { get; set; } @Html.TextBoxFor(model => model.deliveryDate,
new { @id = "TextBox1",onclick = "PersianDatePicker.Show(this,'PersianDateTime.Now.now.ToString(PersianDateTimeFormat.Date)')" })
function setValue(date) {
_textBox.value = date;
_textBox.focus();
hide();
try {
_textBox.onchange();
}catch(ex) {}
} "ReleaseDate" "" new "PersianDatePicker.Show();" } )
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title>
<link href="~/Content/PersianDatePicker.css" rel="stylesheet" />
</head>
<body>
@RenderBody()
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/PersianDatePicker.js"></script>
@RenderSection("Scripts", required: false)
</body>
</html> @using System.Globalization
@model DateTime?
@{
Func<DateTime, string> toPersianDate = date =>
{
var dateTime = new DateTime(date.Year, date.Month, date.Day, new GregorianCalendar());
var persianCalendar = new PersianCalendar();
return persianCalendar.GetYear(dateTime) + "/" +
persianCalendar.GetMonth(dateTime).ToString("00") + "/" +
persianCalendar.GetDayOfMonth(dateTime).ToString("00");
};
var today = toPersianDate(DateTime.Now);
var name = this.ViewContext.ViewData.ModelMetadata.PropertyName;
var value = Model.HasValue ? toPersianDate(Model.Value) : string.Empty;
}
<input type="text" dir="ltr"
name="@name" id="@name"
value="@value"
onclick="PersianDatePicker.Show(this,'@today');" /> // Location: Views\Shared\EditorTemplates\PersianDatePicker.cshtml
[UIHint("PersianDatePicker")]
public DateTime AddDate { set; get; } <div>
<label>تاریخ:</label>
@Html.EditorFor(model => model.AddDate)
</div> باسلام وتشکر
من دقیقا همین کارها را انجام دادم اما موقع ذخیره تاریخ خطای زیر را میدهد
The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated
مثل اینکه فرمت تاریخ و ساعتی که خروجی persiandatapicker است را نمیتواند ذخیره کند
ممنون از توجهتون
namespace MvcAppPersianDatePicker.ViewModels
{
public class PostViewModel
{
public Post post { get; set; }
}
} namespace MvcAppPersianDatePicker.Controllers
{
public class HomeController : Controller
{
[HttpGet]
public ActionResult Index()
{
var model = new PostViewModel();
model.post = new Post() { AddDate = DateTime.Now.AddDays(-1), Title = "تست" };
return View(model);
}
[HttpPost]
public ActionResult Index(PostViewModel model)
{
if (ModelState.IsValid)
{
// todo: save data
return RedirectToAction("Index");
}
return View(model);
}
}
} مشکل از این مثال یا این تقویم یا هیچکدوم نیست. مشکل از اینجا است که در حین Post، سیستم بایندینگ MVC میاد نگاه میکنه چه خواصی رو در کلاس PostViewModel داری (اسم این کلاس مهم نیست). زمانی که در اون خاصیت AddDate رو پیدا نکرد، خوب ... همه چیز تموم میشه. خاصیتی رو پیدا نکرده که اطلاعات دریافتی رو بهش بایند کنه، بنابراین خاصیتهای شیء تو در تویی که درست کردی، خالی باقی میمونه. این نوع View مدل بیشتر برای حالت Get استفاده میشه نه حالت Post. برای حالت Get ایی که قراره در یک صفحه چند منبع داده رو به قسمتهای مختلف اون بایند کنی.
البته MVC میتونه به یک شیء تو در تو هم اطلاعات رو در حالت Post بایند کنه. اینطوری model=> model.Post.AddDate (دو تا دات داره نه یکی). خودت باید دستی این چند سطح رو مشخص کنی (در متدهای For دار).
txtDate.Attributes["onclick"] = "PersianDatePicker.Show(this,'" + pc.GetYear(now)+"/"+pc.GetMonth(now)+"/"+pc.GetDayOfMonth(now) + "');";
شاید بهتر باشه برای انتخاب زمان از یک افزونهی مرتبط استفاده کنی مثل آشنایی با پلاگین TickTack برای Mask ورودی کاربر
public DateTime AddDate { set; get; } public DateTime ? AddDate { set; get; } این پروژه یک فایل اسکریپت بیشتر نیست. بنابراین برای کار کردن نیاز به الحاق آن به صفحه هست (مثل تمام پروژههای جاوا اسکریپتی). ضمنا این مطلب رو برای سؤال پرسیدن باید رعایت کنی: آناتومی یک گزارش خطای خوب . کسی نمیدونه این ارور میده یعنی چی؟ چه خطایی میده؟ کسی مونیتورت رو نمیتونه از راه دور ببینه. باید توضیح بدی. تشریحش کنی با کمک این ابزار: نحوه استفاده از افزونه Firebug برای دیباگ برنامههای ASP.NET مبتنی بر jQuery
[DisplayName("تاریخ شروع قرارداد")]
[Required(ErrorMessage = "تاریخ شروع قرارداد مشخص نشده است")]
public DateTime ContractStartDate { get; set; } @Html.EditorFor(model => model.ContractStartDate, MVC.Shared.Views.EditorTemplates.PersianDatePicker)
[HttpPost]
[ValidateAntiForgeryToken()]
public virtual ActionResult Create(AddContractVM vm)
{
if (!ModelState.IsValid)
{
return View(vm);
}
else
{
if (new Services.Contract().Add(vm))
{
return RedirectToAction("Index");
}
else
{
return View(vm);
}
}
}
string key = "data-val-date";
if (validationAttributes.ContainsKey(key))
{
validationAttributes[key] = "تاریخ را به شکل صحیح وارد کنید";
}
DateTime defaultdate=new DateTime();
if (date == defaultdate)
{
return string.Empty;
} // nullable
if (valueResult.AttemptedValue.Length == 0)
{
return valueResult.AttemptedValue;
}
// اگر تاریخ مقدار داشت مقدار آن کمتر یا بیشتر از 10 نباشد
else if (valueResult.AttemptedValue.Length != 10)
{
modelState.Errors.Add(" تاریخ را به شکل صحیح وارد کنید (مثال " + DateTimeExtention.ToFarsi(DateTime.Now, null).ToString() + ") ");
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
return valueResult.AttemptedValue;
}
object actualValue = null; // یا یک تاریخ میلادی function isLeapYear(pYear) {
// Persian leap year follows a 33-year cycle pattern
// Using the algorithm: year % 33, if remainder is one of [1, 5, 9, 13, 17, 21, 25, 29], it's a leap year
const remainder = pYear % 33;
const leapYears = [1, 5, 9, 13, 17, 21, 25, 29];
return leapYears.includes(remainder);
}