SORU
30 HAZİRAN 2012, CUMARTESİ


Format ASP.NET mvc 4 datetime

Nasıl mvc 4 ASP.NET datetime biçimi zorlayabilir miyim ? Ekran modunda istediğim gibi gösterir ama düzenleme modeli değil. Displayfor ve editorfor kullanıyorum ve=ile gerçek dataformatstring="{0:dd/MM/yyyy}"applyformatineditmode Ne denedim:

  • web genelleştirme.config (ikisi) kültür ve benim uiculture.
  • application_start kültür ve uıculture () değiştirme
  • özel datetime için modelbinder

Bu gücü nasıl ve dd/varsayılan/yyyy değil MM olarak tarih girişi gerekiyor hiçbir fikrim yok.

DAHA FAZLA BİLGİ: benim viewmodel böyle

    [DisplayName("date of birth")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
    public DateTime? Birth { get; set; }

görünümünde @Html.DisplayFor(m=>m.Birth) ama bu beklendiği gibi çalışır (biçimlendirme görüyorum. ve giriş tarihinden kullanıyorum @Html.EditorFor(m=>m.Birth) ama eğer çalışıyorum ve giriş gibi bir şey 13/12/2000 başarısız olan hata bu geçerli bir tarih (12/13/2000 ve 2000/12/13 çalışma olarak beklenen ama ihtiyacım var GG/AA/yyyy).

Özel modelbinder application_start denir() c başka yer bilmiyorum b/.

<globalization/> culture="ro-RO", uiCulture="ro" ile denedim ve bana GG/AA/verecek diğer kültürleri yyyy. Ayrıca başına iş parçacığı olarak ayarlamak için application_start denedim() (örnekler burada, bunu yapmak için nasıl bir yeri vardır)


Bunu okuyacak tüm bu soru: Darin Dimitrov cevabı istemci doğrulama yok sürece çalışacak gibi görünüyor. Başka bir yaklaşım istemci tarafında doğrulama da dahil olmak üzere özel doğrulama kullanmaktır. Bu tüm uygulama önce yeniden bulduğuma sevindim.

CEVAP
30 HAZİRAN 2012, CUMARTESİ


Ahhhh, şimdi açıktır. Sorunlar değeri bağlama geri var gibi görünüyor. Görüntüsünde görüntüleme ile değil. Gerçekten de, bu varsayılan model binder hatası. Yazma ve dikkate modeline [DisplayFormat] öznitelik alacak özel bir kullanabilirsiniz. Burada bu özel model binder resimli var: http://stackoverflow.com/a/7836093/29407


Görünüşe göre bazı sorunlar hala devam ediyor. İşte tam benim Kur gayet iyi 3 VE 4 de ASP.NET MVC RC üzerinde çalışıyor.

Model:

public class MyViewModel
{
    [DisplayName("date of birth")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
    public DateTime? Birth { get; set; }
}

Denetleyici:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel
        {
            Birth = DateTime.Now
        });
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

Görünüm:

@model MyViewModel

@using (Html.BeginForm())
{
    @Html.LabelFor(x => x.Birth)
    @Html.EditorFor(x => x.Birth)
    @Html.ValidationMessageFor(x => x.Birth)
    <button type="submit">OK</button>
}

Application_Start özel model binder kayıt:

ModelBinders.Binders.Add(typeof(DateTime?), new MyDateTimeModelBinder());

Ve özel model binder kendisi:

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);
    }
}

Şimdi, web sitenizin kurulum var ne olursa olsun.config (<globalization> element) veya geçerli iş parçacığı kültür, özel model binder null tarihleri ayrıştırılırken DisplayFormat öznitelik tarih biçimi kullanır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HTC Tutorials

    HTC Tutorial

    21 EYLÜL 2010
  • Kenneth Håkonsen

    Kenneth Håk

    13 Mart 2011
  • kev5124

    kev5124

    9 Kasım 2008