2012-09-03 12 views

Antwort

19

Sie sollten den Wert nicht im attributes-Parameter festlegen müssen. MVC sollte es automatisch für Sie binden.

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

es doesen't Arbeit! – arnoldrob

+0

Es ist in Ordnung, aber ich mache einen großen Fehler! Es tut uns leid! Danke – arnoldrob

+0

Dies funktioniert nicht in MVC4. –

7

Es ist nur Wert, nicht @value .. es versuchen. Ich bin mir nicht sicher @ Model.title, vielleicht ist es nur Model.title

+0

funktioniert es nicht! – arnoldrob

+0

@arnoldrob hast du beides versucht? Es soll wie folgt aussehen: @ Html.HiddenFor (Modell => model.title, neuer {id = "natureOfVisitField", Wert = '@ Model.title'}) oder nur Model.title am Ende .. Es läuft in meinem Projekt –

+0

Ich habe es versucht, aber es funktioniert nicht! Trotzdem danke! – arnoldrob

62

Für Wert in verstecktem Feld Einstellung zu tun in der folgenden Art und Weise:

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

Es funktioniert

+0

Es funktioniert, danke. – Anthony

+0

funktioniert in MVC3? –

+0

Ich weiß, ich bin mehr als 2 Jahre zu spät mit diesem, aber es ist wichtig, dass der HTML-Tag mit diesem deutlichen hat 'Value' und' value' Tags zu erbringenden zu beachten. Sie wollen 'value' verwenden, weil das ist, wo der Controller für Ihre Daten aussehen – Ortund

3

diese Frage Necroing weil ich kürzlich selbst auf das Problem gestoßen bin, als ich versuchte, einer bestehenden Entität eine verwandte Eigenschaft hinzuzufügen. Ich beendete gerade eine nette Erweiterung Methode bilden:

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

Verwendung wie folgt:

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

Beachten Sie, dass dies eine ähnliche Signatur das hat eingebaute in HiddenFor, verwendet aber generische Typisierung, also wenn Wert Ist vom Typ System.Object, Sie werden tatsächlich das in das Framework eingebaute aufrufen. Nicht sicher, warum Sie eine Eigenschaft vom Typ System.Object würde Bearbeitung in Ihre Ansichten obwohl ...

24

Seltsam aber, Versuchen mit @Value, Kapital „V“

z.B. (Arbeiten an MVC4)

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

Update:

gefunden, dass @Value (Kapital V) wird ein weiteres Attribut mit "Value" zusammen mit "Wert" zu schaffen, kleinen @value mit scheint auch zu funktionieren!

Überprüfen Sie den MVC-Quellcode, um mehr zu finden.


Update Nach durchmachen, wie es funktioniert intern:

Zunächst einmal all diese Abhilfen vergessen (ich habe im Interesse der Kontinuität hier gehalten in), jetzt sieht albern :)

Grundsätzlich

kommt es, wenn ein Modell gebucht wird und das Modell zurückgeführt wird auf derselben Seite.

Der Wert zugegriffen wird (und in HTML-gebildet werden) in InputHelper Methode (InputExtensions.cs) unter Verwendung von folgendem Codefragment

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

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

ViewData.ModelState.TryGetValue(key, out modelState) 
Hier

ist das Problem, da der Wert von ViewData.ModelState Wörterbuch zugegriffen wird. Dies gibt den Wert von der Seite anstelle von geändertenem Wert geschrieben !!

Wenn Ihr Wert der Variable (zB Person.Id) 0 ist, Sie aber den Wert innerhalb der Aktion httpPost setzen (zB Person.Id = 2), behält ModelState den alten Wert "0" und appliedValue enthält "0"! Das Feld in der gerenderten Seite enthält also "0" als Wert !!

Abhilfe Wenn Sie Modell auf derselben Seite zurückkehren: Deaktivieren Sie das Element aus Model, z.B. ModelState.Remove ("Id");

Dies wird das Element aus Wörterbuch und die ViewData.ModelState.TryGetValue (Schlüssel, aus Model) gibt null zurück, und die nächste Anweisung (innen InputExtensions.cs) führt den Istwert (valueParameter) entfernen bestanden HiddenFor (m => m.Id)

dies in der folgenden Zeile in InputExtensions.cs erfolgt

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

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

Hoffe, das ist hilfreich.

+0

Wert mit „V“ für mich gearbeitet .think Sie – aboamin12

+0

finde ich sehr seltsam, aber es scheint korrekt zu sein. Ich habe den ModelState.Remove ("") in meinem Controller hinzugefügt und mein Problem ist weg. – RitchieD

+0

Großer Fang. Dieses Problem hat einige Zeit und diese Antwort aufgegriffen. Es geht mich darum, dass ich an anderer Stelle einige andere Feinheiten übersehen habe. –

Verwandte Themen