it-swarm.com.de

Html.TextBoxFor formatieren oder Html.EditorFor htmlAttributes?

Ich bin irgendwie verblüfft, weil ich den Wert formatieren und ein HTML-Attribut für die Css-Klasse hinzufügen möchte. 

Wenn ich @Html.TextBoxFor(m => m.DateModified)- benutze, kann ich das html-Attribut hinzufügen, aber die Formatierung funktioniert nicht über das DisplayFormat-Attribut des Members.

Wenn ich @Html.EditorFor(m => m.DateModified)- benutze, funktioniert die Formatierung, aber ich kann kein HTML-Attribut hinzufügen

Wenn ich @Html.TextBox("DateModified", Model.DateModified, ...)- verwende, erhalte ich eine Nullreferenzausnahme, wenn Model null ist, wenn sich das Formular im Add-Modus befindet

Was ist der beste Weg, um dies zu erreichen?

20
lahsrah

Am Ende habe ich das Problem gelöst, indem ich eine benutzerdefinierte Editorvorlage für meine Datumsauswahl erstellt habe:

Shared/EditorTemplates/DateTime.cshtml

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

Dann in meiner Originalseite weiter verwenden 

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

Du könntest...

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

Verwenden Sie @ Html.EditorFor (m => m.DateModified), da das DisplayFormat-Attribut andernfalls keine Auswirkungen hat.

Um weitere Attribute wie eine CSS-Klasse hinzuzufügen, müssen Sie eine Editorvorlage für die DateTime ..__ erstellen. Erstellen Sie eine Datei EditorTemplates/DateTime.cshtml mit folgendem Inhalt:

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

Bitte beachten Sie, dass der Wert der TextBox nicht direkt mit dem Modell festgelegt wird, sondern mit TemplateInfo.FormattedModelValue , da dieser Wert gemäß dem DisplayFormat-Attribut formatiert wird, während das Modell nicht formatiert ist. (Das hat mich einige Zeit gekostet. :))

In einfachen Fällen kann dies ausreichen, z. wenn die CSS-Klasse für alle Datumseditoren gleich sein kann.

Wenn Sie das Attribut parametrisieren möchten, können Sie dies auch tun, indem Sie den Parameter value-Parameter an EditorFor übergeben. 

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

Dieser Parameter wird jedoch nicht automatisch als Attribut an das HTML-Steuerelement delegiert. Sie müssen jedoch explizit in der Vorlage "damit umgehen". Nach meinen Erfahrungen können Sie auf diesen Parameterwert in den ViewData in der Vorlage zugreifen, sodass die parametrisierte Vorlage folgendermaßen aussieht:

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

Konvertieren Sie das ViewData-Objekt in ein Dictionary, und übergeben Sie dieses Dictionary-Objekt an TextBox, um zu verhindern, dass die in EditorFor aufgelisteten Schlüssel/Wert-Paare hart codiert werden. 

z.B

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

Und in der Vorlage hast du 

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

So zeigen Sie das Json-Datum im Textfeld (cshtml) an:

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