2012-03-15 14 views
6
C# bir ASP.NET MVC3 uygulaması yazıyorum ve bana göre Html.HiddenFor arayarak (yanlış ve) bir farklı DateTime hale getirecek bulduk

DateTime biçimlendirir .Html.HiddenFor eğer i <code>Html.DisplayFor</code> aramaya oldu yanlış ASP.NET

Modelin değerini alması, bir DisplayFormat dekoratörüne sahip ve bu, Html.DisplayFor için çalışıyor gibi görünüyor. Söz konusu özellik olarak yazılır:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
public DateTime MeetingStartDate { get; set; } 

Ve görünüm, bu kullanarak: HiddenFor value="04/16/2012 00:00:00" olarak verecek ancak

@Html.DisplayFor(model => model.MeetingStartDate) 
@Html.HiddenFor(model => model.MeetingStartDate) 

DisplayFor çağrı 16/04/2012 olarak tarih hale getirecek.

Geçerli kültürü değiştirerek DateTimeFormat'u ayarlamayı denedim, ancak bunun hiçbir etkisi olmadı.

Geçerli kültür en-GB'tır, bu yüzden en-ABD tarihlerini yazdırmamak gerekir.

+1

Değer gizlenmişse, neden biçimlendirilmiş olduğu önemli? Muhtemelen sadece geri dönüşte tekrar ayrıştırılması gerekiyor ...* insan * tüketimi için değilse, formatın önemi olmamalıdır. –

+0

@JonSkeet Herhangi bir nedenden ötürü, bu model, en-GB'de çalışıyorum, ancak baskıyı en-ABD tarihini geçersiz kılar. Ancak * sadece * bu gizli öğe için –

+1

Özel bir düzenleyici şablonu kullanabilirsiniz. Yanıta bakın: http://stackoverflow.com/questions/8305262/asp-net-mvc-format-of-hidden-datetime –

cevap

18

bir in-view alternatifi ortaya değildir ve böyle bir kimlik verin eğer html gizli özniteliği.

@Html.TextBoxFor(model => model.CreatedDate, "{0:dd/MM/yyyy HH:mm:ss.fff}", htmlAttributes: new { @type = "hidden" }) 
0

Modelinizde, MeetingStartDate özelliğinin Get işlevi için biçimlendirilmiş bir DateTime döndürebilir misiniz?

DisplayFormat, gizli değerler için çalışmayacaktır çünkü MVC, alan için geçerli olarak ayarlanmış olan verilerden Form Submit eylemi sırasında doğru şekilde ayrıştırılabilen gizli alanda bir değer yaratmaktadır.

MVC tarafından beklenen işlemleriniz.

+0

Nasıl döneceksin? biçimlendirilmiş bir tarih, biçimlendirme yalnızca 'DateTime' bir dizeye dönüştürüldüğünde uygulandığını düşündüm? –

+3

Özniteliklerinizi öğelerinizi iskeleye eklemek istediğinizi anlıyorum, ancak bu durumda ToString'i kullanırsam '@ Html.Hidden (" MeetingStartDate ", model.MeetingStartDate.ToShortDateString())' – bdparrish

+0

Olayını kullanmanız gerekir. "dd/MM/yyyy") hala tarihini en-ABD tarihi olarak çıkaracak –

8

Eğer varsayılan birini (~/Views/Shared/EditorTemplates/HiddenInput.cshtml) geçersiz kılmak için özel bir editör şablonu tanımlayabilirsiniz tanımlanmış biçimi saygı gizli bir alan oluşturmak istiyorsanız:

@if (!ViewData.ModelMetadata.HideSurroundingHtml) 
{ 
    @ViewData.TemplateInfo.FormattedModelValue 
} 
@Html.Hidden("", ViewData.TemplateInfo.FormattedModelValue) 

ve şimdi ile model özelliğini süslemeleri [HiddenInput] özellik:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
[HiddenInput(DisplayValue = false)] 
public DateTime MeetingStartDate { get; set; } 

ve görünümde:

@Html.DisplayFor(model => model.MeetingStartDate) 
@Html.EditorFor(model => model.MeetingStartDate) 
Gizli değeri için doğru biçim kullanılmayacaktır

:

<input data-val="true" data-val-required="The MeetingStartDate field is required." id="MeetingStartDate" name="MeetingStartDate" type="hidden" value="15/03/2012" /> 
4

Ya elle HiddenFor uygulanmasını zekâsı ve yerine TextBoxFor yeniden edebilir type = "gizli" ayarlayın. Böyle

şey:

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

Eğer sorun tarih biçimini belirtirseniz TextBoxFor çalışacaktır kullanarak

<%= Html.TextBoxFor(model => Model.DiscountRate,new { @id = "DiscountRate", @Value=Model.DiscountRate})%>