web-dev-qa-db-fra.com

Vous obtenez une erreur de modèle lorsque j'essaie de le faire?

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.

18
chobo2

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())
51
Darin Dimitrov

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)
6
silencedmessage

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)
5
Sidz

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.

5
Tomas Aschan

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 ()})

0
MAhesh Chikhale

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 )
0
Daniel