Ahhhh,現在很清楚。您似乎遇到綁定該值的問題。不是在視圖上顯示它。事實上,這是默認模型綁定器的缺點。您可以編寫並使用自定義的模型,該模型將考慮您的模型中的[DisplayFormat]
屬性。我在這裏說明這樣的自定義模型粘合劑:https://stackoverflow.com/a/7836093/29407
顯然有些問題依然存在。這裏是我的完整設置在ASP.NET MVC 3 & 4 RC上完美運行。
型號:
public class MyViewModel
{
[DisplayName("date of birth")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? Birth { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel
{
Birth = DateTime.Now
});
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
查看:
@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
:
ModelBinders.Binders.Add(typeof(DateTime?), new MyDateTimeModelBinder());
而且自定義模型粘合劑本身:
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);
}
}
現在,無論你在你的web.config(<globalization>
元素)或當前線程的文化有什麼文化設置,自定義模型粘合劑將使用DisplayFormat
屬性的日期格式時解析可以爲空的日期。
請您提供:
可以使用安裝moment.js更多信息?你的模型,控制器和視圖?還提供了您在顯示和編輯器模板之間獲得的不同輸出的示例。另請注意,文化是針對每個線程設置的。你提到了一些關於'Application_Start'的內容,但是這隻會在應用程序啓動時執行一次。隨後的要求呢?你如何爲他們設定文化? –
application_start只能執行一次!改用application_beginRequest! – Nas
Nas,application_beginRequest在哪裏?我只在Global看到application_start。在MVC 4事情開始有點不同,然後mvc 3 – amb