it-swarm.com.de

HTML.HiddenFor-Wert gesetzt

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'})

es geht nicht! wie man den Wert einstellt

37
arnoldrob

Sie sollten den Wert nicht im Attributparameter einstellen müssen. MVC sollte es automatisch für Sie binden.

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField" })
23
Daniel A. White

Um den Wert in einem ausgeblendeten Feld einzustellen, gehen Sie folgendermaßen vor:

@Html.HiddenFor(model => model.title, 
                new { id= "natureOfVisitField", Value = @Model.title})

Es wird klappen

82
user1187093

Seltsam, aber versuchen Sie es mit @Value, Großbuchstabe "V"

z.B. (Arbeit an MVC4)

@Html.HiddenFor(m => m.Id, new { @Value = Model.Id })

Aktualisieren:

Es wurde festgestellt, dass @Value (Großbuchstabe V) ein weiteres Attribut mit "Value" zusammen mit "Value" erstellt. Das Verwenden von kleinen @ -Werten scheint ebenfalls zu funktionieren! 

Sie müssen den MVC-Quellcode überprüfen, um weitere Informationen zu erhalten.


Update, Nachdem Sie durchgesehen haben, wie es intern funktioniert:

Vergessen Sie zunächst all diese Problemumgehungen (ich habe hier aus Gründen der Kontinuität beibehalten), jetzt sieht es dumm aus :)

Grundsätzlich geschieht dies, wenn ein Modell gepostet wird und das Modell zu derselben Seite zurückkehrt.

Auf den Wert wird in der InputHelper-Methode (InputExtensions.cs) unter Verwendung des folgenden Codefragments zugegriffen (und in HTML umgewandelt)

string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));

Die GetModelStateValue-Methode (in Htmlelper.cs) ruft den Wert als ab

ViewData.ModelState.TryGetValue(key, out modelState)

Hier ist das Problem, da auf den Wert aus dem ViewData.ModelState-Wörterbuch zugegriffen wird .. _. Dies gibt den von der Seite geposteten Wert anstelle des geänderten Werts zurück !!

wenn der Wert der Variablen (z. B. Person.Id) 0 ist, Sie jedoch den Wert in der Aktion httpPost (z. B. Person.Id = 2) festlegen, behält der ModelState den alten Wert "0" und den tryedValue . enthält "0"! das Feld in der gerenderten Seite enthält also "0" als Wert !!

Problemumgehung, wenn Sie das Modell auf dieselbe Seite zurückgeben: Löschen Sie das Element aus ModelState. ModelState.Remove ("Id"); 

Dadurch wird das Element aus dem Wörterbuch und der .__ entfernt. ViewData.ModelState.TryGetValue (key, out modelState) Gibt null zurück. Die nächste Anweisung (in InputExtensions.cs) übernimmt den tatsächlichen Wert ( valueParameter ), der an .__ übergeben wird. HiddenFor (m => m.Id)

dies geschieht in der folgenden Zeile in InputExtensions.cs

tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);

Zusammenfassung: Löschen Sie das Element in ModelState mithilfe von ModelState.Remove ("...");

Hoffe das ist hilfreich.

34
Tejasvi Hegde

Es ist nur Value, nicht @value .. Versuchen Sie es. Ich bin nicht sicher über @ Model.title, vielleicht handelt es sich nur um Model.title

10
der_chirurg

Necroing diese Frage, weil ich vor kurzem selbst auf das Problem gestoßen bin, als ich versuchte, einer vorhandenen Entität eine verwandte Eigenschaft hinzuzufügen. Ich habe gerade eine Nice-Erweiterungsmethode erstellt:

    public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, TProperty value)
    {
        string expressionText = ExpressionHelper.GetExpressionText(expression);
        string propertyName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expressionText);

        return htmlHelper.Hidden(propertyName, value);
    }

Verwenden Sie wie folgt:

@Html.HiddenFor(m => m.RELATED_ID, Related.Id)

Beachten Sie, dass dies eine ähnliche Signatur wie das integrierte HiddenFor hat, jedoch die generische Typisierung verwendet wird. Wenn Value also vom Typ System.Object ist, rufen Sie tatsächlich die im Framework eingebettete auf. Sie sind sich nicht sicher, warum Sie in Ihren Ansichten eine Eigenschaft vom Typ System.Object bearbeiten ...

3
Stevoman

Das kannst du so machen

@Html.HiddenFor(model=>model.title, new {ng_init = string.Format("model.title='{0}'", Model.title) })
0
Ali Hasan

Das @ -Symbol wird bei der Angabe von HtmlAttributes verwendet, wenn das "Ding", das Sie festlegen möchten, ein Schlüsselwort c # ist. Zum Beispiel für die Word-Klasse können Sie keine Klasse angeben. Sie müssen @class verwenden.

0
Mike