在我的ASP.net MVC应用程序中,我有一个看起来像这样的视图:
...
<label>Due Date</label>
<%=Html.TextBox("due")%>
...
Run Code Online (Sandbox Code Playgroud)
我使用a ModelBinder
将帖子绑定到我的模型(到期属性是DateTime
类型).问题是当我将"01/01/2009"放入文本框时,帖子没有验证(由于其他数据输入不正确).活页夹以日期和时间 "01/01/2009 00:00:00 " 重新填充.
有没有办法告诉活页夹正确格式化日期(即ToShortDateString()
)?
Nic*_*ick 55
我刚刚遇到了这个非常简单而优雅的解决方案,可以在MVC 2中找到:
http://geekswithblogs.net/michelotti/archive/2010/02/05/mvc-2-editor-template-with-datetime.aspx
基本上,如果您使用的是MVC 2.0,请在视图中使用以下内容.
<%=Html.LabelFor(m => m.due) %>
<%=Html.EditorFor(m => m.due)%>
Run Code Online (Sandbox Code Playgroud)
然后在/ Views/Shared/EditorTemplates中创建一个名为DateTime.ascx的局部视图
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime?>" %>
<%=Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" }) %>
Run Code Online (Sandbox Code Playgroud)
当调用EditorFor <>时,它将找到匹配的编辑器模板.
小智 24
使用属性装饰模型中的DataType
属性,并指定其a Date
,而不是DateTime
:
public class Model {
[DataType(DataType.Date)]
public DateTime? Due { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
你必须使用EditorFor
而不是TextBoxFor
在视图中:
@Html.EditorFor(m => m.Due)
Run Code Online (Sandbox Code Playgroud)
这是一个肮脏的黑客,但它似乎工作.
<%= Html.TextBoxFor(model => model.SomeDate,
new Dictionary<string, object> { { "Value", Model.SomeDate.ToShortDateString() } })%>
Run Code Online (Sandbox Code Playgroud)
您获得了模型绑定,并且能够使用格式化字符串覆盖文本字段的HTML"value"属性.
为了在视图后面的代码中获得对模型的强类型访问,您可以执行以下操作:
public partial class SomethingView : ViewPage<T>
{
}
Run Code Online (Sandbox Code Playgroud)
其中 T 是您要从 Action 传入的 ViewData 类型。
然后在你的控制器中你将有一个动作:
public ActionResult Something(){
T myObject = new T();
T.Property = DateTime.Today();
Return View("Something", myObject);
}
Run Code Online (Sandbox Code Playgroud)
之后,您的视图中就有了很好的强类型模型数据,因此您可以执行以下操作:
<label>My Property</label>
<%=Html.TextBox(ViewData.Model.Property.ToShortDateString())%>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
44579 次 |
最近记录: |