/ / Html.TextBoxFor formatowanie lub Html.EditorFor htmlAttributes? - c #, asp.net-mvc, asp.net-mvc-3

Formatowanie Html.TextBoxFor lub Html.EditorFor htmlAttributes? - c #, asp.net-mvc, asp.net-mvc-3

Jestem trochę zakłopotany, ponieważ chcę sformatować wartość i dodać atrybut html dla klasy css.

Jeśli używam @Html.TextBoxFor(m => m.DateModified) - Mogę dodać atrybut html, ale formatowanie nie działa poprzez atrybut DisplayFormat na elemencie.

Jeśli używam @Html.EditorFor(m => m.DateModified) - Formatowanie działa, ale nie mogę dodać atrybutu html

Jeśli używam @Html.TextBox("DateModified", Model.DateModified, ...) - Otrzymuję wyjątek odwołania zerowego, gdy Model ma zerową wartość, gdy formularz jest w trybie dodawania

Jaki jest najlepszy sposób, aby to osiągnąć?

Odpowiedzi:

17 dla odpowiedzi nr 1

W końcu rozwiązałem ten problem, tworząc niestandardowy szablon edytora dla mojego selektora dat:

Shared / EditorTemplates / DateTime.cshtml

 @model System.DateTime?
@Html.TextBox("", Model.HasValue ? Model.Value.ToString("dd/MM/yyyy") : string.Empty, new { @class = "date-picker" })

Następnie na mojej oryginalnej stronie nadal używam

@Html.EditorFor(m => m.DateModified)

10 dla odpowiedzi nr 2

Mógłbyś...

@Html.TextBoxFor(m => m.DateModified, new { Value = Model.DateModified.ToString("MM-dd-yyyy"), @class = "superCoolClassName"})

3 dla odpowiedzi nr 3

Użyj @ Html.EditorFor (m => m.DateModified), ponieważ w przeciwnym razie atrybut DisplayFormat nie będzie miał żadnego efektu.

Aby dodać kolejne atrybuty, takie jak klasa CSS, musisz utworzyć szablon edytora dla DateTime. Utwórz plik EditorTemplates / DateTime.cshtml o następującej treści:

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new
{
@class="date"
})

Zwróć uwagę, że wartość TextBox nie jest ustawiona bezpośrednio w Modelu, ale raczej z TemplateInfo.FormattedModelValue, ponieważ ta wartość zostanie sformatowana zgodnie z atrybutem DisplayFormat, a Model nie. (Zajęło mi to trochę czasu. :))

W prostych przypadkach może to wystarczyć, np. jeśli klasa CSS może być taka sama dla wszystkich edytorów daty.

Jeśli chcesz parametryzować atrybut, możesz to również zrobić, przekazując parametr wartości atrybutu do EditorFor.

@Html.EditorFor(m => m.DateModified, new { @class = "someClass" })

Jednak ten parametr nie będzie automagicznieprzekazane do kontroli HTML jako atrybut, ale musisz "obsłużyć" w szablonie jawnie. Według moich doświadczeń można uzyskać dostęp do wartości tego parametru w ViewData w szablonie, więc sparametryzowany szablon wygląda następująco:

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new
{
@class=ViewData["class"]
})

1 dla odpowiedzi nr 4

Aby zapobiec kodowaniu kluczem pary klucz / wartość wymienione w edytorze, należy przekonwertować obiekt ViewData na słownik i przekazać ten obiekt słownika do obiektu TextBox.

na przykład

    @Html.EditorFor(m => m.DateModified, "Template", new { @class = "someClass", size=8 , htmlTag="custom" })

I w szablonie, który masz

    @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, ViewData.ToDictionary(c=>c.Key,c=>.Value))

0 dla odpowiedzi № 5

Aby wyświetlić datę json w polu tekstowym (cshtml):

var d1 = ui.item.IssueDate;
var d = new Date(parseInt(d1.slice(6, -2)));
var Issdate = ("0" + (d.getMonth() + 1)).slice(-2) + "/" +
("0" + d.getDate()).slice(-2) + "/" +
d.getFullYear().toString();
$("#IssueDate").val(Issdate);