it-swarm-id.com

ASP.NET MVC3 - Format DateTime

Saya menggunakan ASP.NET MVC 3.
ViewModel saya terlihat seperti ini:

public class Foo
{
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
    public DateTime StartDate { get; set; }
    ...
}

Dalam pandangan, saya punya sesuatu seperti ini:

<div class="editor-field">
    @Html.EditorFor(model => model.StartDate)
    <br />
    @Html.ValidationMessageFor(model => model.StartDate)
</div>

StartDate ditampilkan dalam format yang benar, tetapi ketika saya mengubah nilainya menjadi 19.11.2011 dan mengirimkan formulir, saya mendapatkan pesan kesalahan berikut: "Nilai '19 .11.2011 'tidak valid untuk StartDate."

Bantuan apa pun akan sangat dihargai!

28
šljaker

Anda perlu mengatur budaya yang tepat dalam elemen globalisasi file web.config Anda yang dd.MM.yyyy adalah format datetime yang valid:

<globalization culture="...." uiCulture="...." />

Misalnya itu format default dalam bahasa Jerman: de-DE.


MEMPERBARUI:

Sesuai dengan kebutuhan Anda di bagian komentar Anda ingin menyimpan budaya en-US aplikasi tetapi masih menggunakan format yang berbeda untuk tanggal. Ini dapat dicapai dengan menulis pengikat model khusus:

using System.Web.Mvc;
public class MyDateTimeModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var displayFormat = bindingContext.ModelMetadata.DisplayFormatString;
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (!string.IsNullOrEmpty(displayFormat) && value != null)
        {
            DateTime date;
            displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty);
            // use the format specified in the DisplayFormat attribute to parse the date
            if (DateTime.TryParseExact(value.AttemptedValue, displayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
            {
                return date;
            }
            else
            {
                bindingContext.ModelState.AddModelError(
                    bindingContext.ModelName, 
                    string.Format("{0} is an invalid date format", value.AttemptedValue)
                );
            }
        }

        return base.BindModel(controllerContext, bindingContext);
    }
}

yang akan Anda daftarkan di Application_Start:

ModelBinders.Binders.Add(typeof(DateTime), new MyDateTimeModelBinder());
42
Darin Dimitrov

Berdasarkan komentar Anda, saya melihat yang Anda inginkan adalah arus berbahasa Inggris tetapi dengan format tanggal yang berbeda (Perbaiki saya jika saya salah).

Faktanya adalah DefaultModelBinder menggunakan pengaturan kultur server untuk data formulir. Jadi saya dapat mengatakan server menggunakan budaya "en-US" tetapi dengan format tanggal yang berbeda.

Anda dapat melakukan sesuatu seperti ini di Application_BeginRequest dan Anda selesai! 

protected void Application_BeginRequest()
{
    CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());
    info.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
    System.Threading.Thread.CurrentThread.CurrentCulture = info;
}

Web.Config

<globalization culture="en-US" />
10
VJAI

Menambahkan kode di bawah ini ke global.asax.cs file

protected void Application_BeginRequest()  
{        
    CultureInfo info = new CultureInfo(System.Threading.Thread.CurrentThread.CurrentCulture.ToString());     
    info.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
    System.Threading.Thread.CurrentThread.CurrentCulture = info;     
}

Dan menambahkan di bawah ini ke web.config di bawah <system.web>

<globalization culture="en-US">;
0
Rolwin C