我正在用C#编写一个ASP.NET MVC3应用程序,并且发现在我的视图中调用Html.HiddenFor
会以不同(和不正确)的方式呈现DateTime
,如果我要调用{{1} }}
从中获取值的模型确实有一个DisplayFormat装饰器,这似乎适用于Html.DisplayFor
。有问题的财产写成:
Html.DisplayFor
视图显示使用:
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime MeetingStartDate { get; set; }
DisplayFor调用会将日期呈现为 @Html.DisplayFor(model => model.MeetingStartDate)
@Html.HiddenFor(model => model.MeetingStartDate)
,但HiddenFor会将其呈现为16/04/2012
。
我尝试更改当前文化以设置value="04/16/2012 00:00:00"
,但这没有效果。
目前的文化是en-GB,所以它不应该打印en-US日期。
答案 0 :(得分:22)
如果指定日期格式和html隐藏属性,则使用TextBoxFor的视图内替代方法将起作用。
@Html.TextBoxFor(model => model.CreatedDate, "{0:dd/MM/yyyy HH:mm:ss.fff}", htmlAttributes: new { @type = "hidden" })
答案 1 :(得分:8)
如果要生成一个尊重您定义格式的隐藏字段,您可以定义一个自定义编辑器模板来覆盖默认值(~/Views/Shared/EditorTemplates/HiddenInput.cshtml
):
@if (!ViewData.ModelMetadata.HideSurroundingHtml)
{
@ViewData.TemplateInfo.FormattedModelValue
}
@Html.Hidden("", ViewData.TemplateInfo.FormattedModelValue)
现在用[HiddenInput]
属性装饰你的模型属性:
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
[HiddenInput(DisplayValue = false)]
public DateTime MeetingStartDate { get; set; }
并在您看来:
@Html.DisplayFor(model => model.MeetingStartDate)
@Html.EditorFor(model => model.MeetingStartDate)
将使用正确的隐藏值格式:
<input data-val="true" data-val-required="The MeetingStartDate field is required." id="MeetingStartDate" name="MeetingStartDate" type="hidden" value="15/03/2012" />
答案 2 :(得分:4)
或者你可以超越HiddenFor实现并重用TextBoxFor并手动设置 type =“hidden”。
这样的事情:
public static MvcHtmlString HiddenInputFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes = null)
{
IDictionary<string, object> htmlAttributesTmp = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
if (htmlAttributesTmp.ContainsKey("type"))
{
htmlAttributesTmp["type"] = "hidden";
}
else
{
htmlAttributesTmp.Add("type", "hidden");
}
return html.TextBoxFor(expression, htmlAttributesTmp);
}
答案 3 :(得分:0)
在您的模型中,对于MeetingStartDate属性的Get函数,您可以返回格式化的DateTime吗?
DisplayFormat不适用于隐藏值,因为MVC在隐藏字段中创建一个值,可以在表单提交操作期间从当前为该属性设置的数据中正确解析。
你所拥有的是MVC的预期行动。
答案 4 :(得分:0)
如果你给id这样的问题不会发生
<%= Html.TextBoxFor(model => Model.DiscountRate,new { @id = "DiscountRate", @Value=Model.DiscountRate})%>