J'utilise asp.net mvc 3 et je continue à avoir cette erreur et je ne la comprends pas car je n'utilise pas de modèle.
J'ai ceci dans ma vue partielle
@model ViewModels.FormViewModel
<div="tabs-1">
@Html.TextBoxFor(x => x.Due.ToShortDateString())
</div>
à mon avis
public class FormViewModel
{
public DateTime Due { get; set; }
public FormViewModel()
{
DueDate = DateTime.UtcNow;
}
}
et j'obtiens cette erreur
Les modèles ne peuvent être utilisés qu'avec le champ accès, accès à la propriété, index de tableau à une seule dimension, ou indexeur personnalisé à paramètre unique expressions. Description: Un .hand exception est survenue pendant le exécution de la requête Web en cours . Veuillez vérifier la trace de la pile pour plus d'informations informations sur l'erreur et où cela provient du code.
Détails de l'exception: System.InvalidOperationException: Les modèles ne peuvent être utilisés qu'avec le champ accès, accès à la propriété, index de tableau à une seule dimension, ou indexeur personnalisé à paramètre unique expressions.
Devrait être comme ça:
@Html.TextBoxFor(x => x.Due)
Et si vous voulez un format pour cette date:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime Due { get; set; }
et alors:
@Html.EditorFor(x => x.Due)
si vous voulez vraiment utiliser cette méthode .ToShortDateString()
, vous devez utiliser un helper non typé (évidemment, c'est quelque chose que je recommanderais contre):
@Html.TextBox("Due", Model.Due.ToShortDateString())
Il existe une surcharge qui peut aider à atteindre cet objectif, tout en le gardant fortement typé.
// Specify that you're providing the format argument (string)
@Html.TextBoxFor(x => x.Due, format: Model.Due.ToShortDateString())
// Or use the overload with format and html options, where null is the htmloptions
@Html.TextBoxFor(x => x.Due, Model.Due.ToShortDateString(), null)
Si vous utilisezMVCet que vous avez un élément de code en ligne, essayez de définir un paramètre comme celui-ci -
@{
string parameterValue = DateTime.Parse(@item.Value).ToShortDateString();
}
@Html.DisplayFor(model => parameterValue)
Vous obtenez l'erreur car l'assistant .TextBoxFor()
html utilise un modèle intégré (une zone de texte pour l'entrée de chaîne) et vous lui donnez une expression lambda trop compliquée (c'est-à-dire qu'elle n'appartient pas à l'ensemble des types répertoriés. dans le message).
Pour résoudre le problème, modifiez le type de la propriété que vous souhaitez modifier en string
afin que MVC puisse utiliser le modèle de chaîne par défaut ou laissez MVC utiliser à la place le modèle datetime par défaut. Je recommanderais ce dernier:
@Html.TextBoxFor(m => m.Due)
Si vous n'êtes pas satisfait de la manière dont vos utilisateurs sont invités à modifier une date, insérez une vue partielle nommée "DateTime.cshtml" dans ~/Views/Shared/EditorTemplates, dans laquelle vous créez l'éditeur pour qu'il fonctionne comme vous le souhaitez.
Au lieu d'ajouter un format dans le modèle, utilisez @Value Annotations comme ci-dessous
@ Html.TextBoxFor (x => x.Due new {@ Value = Model.Due.ToShortDateString ()})
Vous induisez en erreur l'application en transmettant une méthode avec le paramètre textboxfor
au lieu de transmettre une expression.
Tu avais :
@Html.TextBoxFor(x => x.Due.ToShortDateString())
Stockez votre résultat dans une variable, puis utilisez une expression. Essaye ça
var shortDate = Model.Due.ToShortDateString();
@Html.TextBoxFor(x => shortDate )