web-dev-qa-db-fra.com

Formatage Html.TextBoxFor ou Html.EditorFor htmlAttributes?

Je suis un peu perplexe parce que je veux formater la valeur et ajouter un attribut HTML pour la classe CSS. 

Si j'utilise @Html.TextBoxFor(m => m.DateModified)-, je peux ajouter un attribut HTML mais la mise en forme ne fonctionne pas via l'attribut DisplayFormat sur le membre.

Si j'utilise @Html.EditorFor(m => m.DateModified)- Le formatage fonctionne mais je ne peux pas ajouter d'attribut html

Si j'utilise @Html.TextBox("DateModified", Model.DateModified, ...)- J'obtiens une exception de référence null lorsque Model est null lorsque le formulaire est en mode d'ajout

Quel est le meilleur moyen d'y parvenir?

20
lahsrah

J'ai finalement résolu ce problème en créant un modèle d'éditeur personnalisé pour mon sélecteur de date, comme suit:

Partagé/EditorTemplates/DateTime.cshtml

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

Puis dans ma page d'origine continuer à utiliser 

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

Vous pourriez...

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

Utilisez @ Html.EditorFor (m => m.DateModified), sinon l'attribut DisplayFormat n'aura aucun effet.

Pour ajouter d'autres attributs, comme une classe CSS, vous devez créer un modèle d'éditeur pour DateTime . Créer un fichier EditorTemplates/DateTime.cshtml avec le contenu suivant:

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

Veuillez noter que la valeur de la zone de texte n'est pas définie directement avec le modèle, mais avec le TemplateInfo.FormattedModelValue , car cette valeur sera formatée en fonction de l'attribut DisplayFormat alors que le modèle ne le sera pas. (Cela m'a pris un certain temps à réaliser. :))

Dans des cas simples, cela peut suffire, par exemple si la classe CSS peut être la même pour tous les éditeurs de date.

Si vous souhaitez paramétrer l'attribut, vous pouvez également le faire en transmettant le paramètre valeur d'attribut à EditorFor. 

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

Toutefois, ce paramètre ne sera pas automatiquement délégué au contrôle HTML en tant qu'attribut, mais vous devez le "manipuler" explicitement dans le modèle. Selon mes expériences, vous pouvez accéder à cette valeur de paramètre dans ViewData dans le modèle, de sorte que le modèle paramétré ressemble à ceci:

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

Pour empêcher le codage en dur des paires clé/valeur répertoriées dans EditorFor, convertissez l'objet ViewData en dictionnaire et transmettez cet objet dictionnaire à TextBox. 

par exemple

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

Et dans le modèle que vous avez 

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

Pour afficher la date JSON dans la zone de texte (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);
0
Mahesh