C# 仅显示Shamsi日历中的日期

C# 仅显示Shamsi日历中的日期,c#,asp.net-mvc,C#,Asp.net Mvc,我使用这些代码来显示: 这是我的模型: public class PaperOrder { public int PaperOrderId { get; set; } [DisplayName("سفارش دهنده")] public string CustomerName { get; set; } [DisplayName("گیرنده")] public string ReceiverName { get; set; } [Di

我使用这些代码来显示:

这是我的模型:

public class PaperOrder
{

    public int PaperOrderId { get; set; }

    [DisplayName("سفارش دهنده")]
    public string CustomerName { get; set; }

    [DisplayName("گیرنده")]
    public string ReceiverName { get; set; }

    [DisplayName("شماره تماس")]
    public string Tel { get; set; }


    [DisplayName(" نوع سفارش")]
    public String OrderType { get; set; }


    [DisplayName("تعداد")]
    public String Count { get; set; }

    [DisplayName("وضعیت سفارش")]
    public OrderStatus OrderStatus { get; set; }

    [DisplayName("تاریخ ارسال سفارش")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime? StartDate { get; set; }

    [DisplayName("تاریخ اتمام سفارش")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime? CompleteDate { get; set; }
}
和其他类别:

   public class PersianCulture : CultureInfo
    {
        private readonly System.Globalization.Calendar cal;
        private readonly System.Globalization.Calendar[] optionals;

        public PersianCulture()
            : this("fa-IR", true)
        { }

        public PersianCulture(string cultureName, bool useUserOverride)
            : base(cultureName, useUserOverride)
        {
            cal = base.OptionalCalendars[0];
            var optionalCalendars = new List<System.Globalization.Calendar>();
            optionalCalendars.AddRange(base.OptionalCalendars);
            optionalCalendars.Insert(0, new PersianCalendar());
            Type formatType = typeof(DateTimeFormatInfo);
            Type calendarType = typeof(System.Globalization.Calendar);
            PropertyInfo idProperty = calendarType.GetProperty("ID", BindingFlags.Instance | BindingFlags.NonPublic);
            FieldInfo optionalCalendarfield = formatType.GetField("optionalCalendars", BindingFlags.Instance | BindingFlags.NonPublic);
            var newOptionalCalendarIDs = new Int32[optionalCalendars.Count];

            for (int i = 0; i < newOptionalCalendarIDs.Length; i++)
                newOptionalCalendarIDs[i] = (Int32)idProperty.GetValue(optionalCalendars[i], null);

            optionalCalendarfield.SetValue(DateTimeFormat, newOptionalCalendarIDs);

            optionals = optionalCalendars.ToArray();

            cal = optionals[0];

            DateTimeFormat.Calendar = optionals[0];

            DateTimeFormat.MonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
            DateTimeFormat.MonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
            DateTimeFormat.AbbreviatedMonthNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
            DateTimeFormat.AbbreviatedMonthGenitiveNames = new[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
            DateTimeFormat.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
            DateTimeFormat.ShortestDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
            DateTimeFormat.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
            DateTimeFormat.AMDesignator = "ق.ظ";
            DateTimeFormat.PMDesignator = "ب.ظ";
            DateTimeFormat.ShortDatePattern = "yyyy/MM/dd";
            DateTimeFormat.ShortTimePattern = "HH:mm";
            DateTimeFormat.LongTimePattern = "HH:mm:ss";
            DateTimeFormat.FullDateTimePattern = "yyyy/MM/dd HH:mm:ss";


        }

        public override System.Globalization.Calendar Calendar
        {
            get { return cal; }
        }

        public override System.Globalization.Calendar[] OptionalCalendars
        {
            get { return optionals; }
        }

        public static DateTime PersianToGregorianUS(DateTime faDate)
        {
            return new PersianCalendar().ToDateTime(faDate.Year, faDate.Month, faDate.Day, faDate.Hour, faDate.Minute, faDate.Second, faDate.Millisecond);
        }

    }

public class DateTimeBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        var date = (DateTime)value.ConvertTo(typeof(DateTime), CultureInfo.CurrentCulture);
         date = PersianCulture.PersianToGregorianUS(date);

        return date;
    }
}

public class NullableDateTimeBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (value != null)
        {
            var date = (DateTime)value.ConvertTo(typeof(DateTime), CultureInfo.CurrentCulture);
            if (date!= null)
                date = PersianCulture.PersianToGregorianUS(date);

            return date;
        }
        return null;
    }
}
    public class DateTimeActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
            //if (System.Threading.Thread.CurrentThread.CurrentCulture.LCID == 1065)
            System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture = new PersianCulture();
        }
    }
我的edit.cshtml的一部分

  <div class="form-group">
        @Html.LabelFor(model => model.StartDate, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.TextBoxFor(model => model.StartDate, new { @id = "pcal1", @class = "pdate form-control" })
            @Html.ValidationMessageFor(model => model.StartDate, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.CompleteDate, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.TextBoxFor(model => model.CompleteDate, new { @id = "pcal2", @class = "pdate form-control" })
            @Html.ValidationMessageFor(model => model.CompleteDate, "", new { @class = "text-danger" })
        </div>
    </div>

@LabelFor(model=>model.StartDate,htmlAttributes:new{@class=“controllabel col-md-2”})
@Html.TextBoxFor(model=>model.StartDate,新的{@id=“pcal1”,@class=“pdate form control”})
@Html.ValidationMessageFor(model=>model.StartDate,“,new{@class=“text danger”})
@LabelFor(model=>model.CompleteDate,htmlAttributes:new{@class=“controllabel col-md-2”})
@TextBoxFor(model=>model.CompleteDate,新的{@id=“pcal2”,@class=“pdate表单控件”})
@Html.ValidationMessageFor(model=>model.CompleteDate,“,new{@class=“text danger”})
每件事都很好,但当我只想在应用程序中显示日期时,它无法正确显示日期。

例如,当我只想在输入中显示日期时,它会这样显示(查看零):

在视图替换代码中:

@Html.TextBoxFor(model => model.StartDate, new { @id = "pcal1", @class = "pdate form-control" })
以下是:

@Html.TextBox("StartDate", Model.StartDate.Value.ToShortDateString(), new { @id = "pcal1", @class = "pdate form-control" })
如果不指定将
DateTime
值转换为
String
的特定方法,则会调用方法
ToString()
,该方法也会显示时间部分。为了避免这种情况,在本例中必须指定正确的方法,即
toSortDateString()
。不要忘了检查可能的空引用

@Html.TextBox("StartDate", Model.StartDate.Value.ToShortDateString(), new { @id = "pcal1", @class = "pdate form-control" })