2010-12-07 3 views

Antwort

75

Die meisten MVC-Hilfsmethoden haben eine XXXFür Variante. Sie sollen in Verbindung mit einer konkreten Modellklasse verwendet werden. Die Idee besteht darin, dem Helper zu ermöglichen, das entsprechende "name" -Attribut für das Formulareingabesteuerelement basierend auf der Eigenschaft abzuleiten, die Sie im Lambda angeben. Dies bedeutet, dass Sie "magische Zeichenfolgen" eliminieren, die Sie andernfalls verwenden müssten, um die Modelleigenschaften mit Ihren Ansichten zu korrelieren. Zum Beispiel:

Html.Hidden("Name", "Value") 

bewirkt:

<input id="Name" name="Name" type="hidden" value="Value"> 

In Ihrem Controller, könnten Sie eine Aktion haben wie:

[HttpPost] 
public ActionResult MyAction(MyModel model) 
{ 
} 

Und ein Modell wie:

public class MyModel 
{ 
    public string Name { get; set; } 
} 

Die rohe Html.Hidden verwenden wir d oben wird mit der Name Eigenschaft im Modell korreliert. Es ist jedoch etwas unangenehm, dass der Wert "Name" für die Eigenschaft mit einem String ("Name") angegeben werden muss. Wenn Sie die Name -Eigenschaft auf dem Modell umbenennen, wird Ihr Code unterbrochen und der Fehler wird etwas schwierig herauszufinden. Auf der anderen Seite, wenn Sie HiddenFor verwenden, erhalten Sie von der geschützt:

Html.HiddenFor(x => x.Name, "Value"); 

Nun, wenn Sie die Name Eigenschaft umbenannt, werden Sie einen expliziten Laufzeitfehler anzeigt, dass das Objekt nicht gefunden werden kann. Darüber hinaus erhalten Sie weitere Vorteile der statischen Analyse, z. B. das Abrufen von Dropdown-Listen der Mitglieder nach der Eingabe x..

+1

Danke Kirk, gute Informationen darüber, was im Controller und Modell passiert. –

+4

Tatsächlich erhalten Sie einen COMPILER-Fehler, kein RUNTIME-Fehler, wenn Sie die Eigenschaft umbenennen. Das ist der Punkt, der beim Kompilieren versagt, nicht ausgeführt wird. –

+2

@Mystere Man, die Ansichten werden normalerweise nicht kompiliert (wenn Sie Ihre Lösung erstellen). [Es ist ein manueller Schritt] (http://stackoverflow.com/questions/383192/compile-views-in-asp-net-mvc), damit VS sie für Sie kompiliert. –

7

Jede Methode in HtmlHelper Klasse hat einen Zwilling mit For Suffix. Html.Hidden einen String als Argument, die Sie aber Html.HiddenFor nimmt eine Expression bereitstellen muss, dass, wenn Sie sehen eine stark typisierte Ansicht ist, dass Sie aus diesem und Futter, das Verfahren einen Lambda profitieren Ausdruck wie dies

o=>o.SomeProperty 

statt "SomeProperty" in dem Fall der Verwendung Html.Hidden Methode.

+0

Danke Jani auf die Info über Helfer Zwillinge. –

9

Die Html.Hidden erstellen eine versteckte Eingabe Aber Sie müssen den Namen und alle Attribute, die Sie diesem Feld und den Wert geben möchten, spezifisch, während die Html.HiddenFor eine versteckte Eingabe für das Objekt erstellen, das Sie übergeben sehen sie so aus:

Html.Hidden("yourProperty",model.yourProperty); 

Html.HiddenFor(m => m.yourProperty) 

In diesem Fall ist der Ausgang derselbe!

+0

Also in einem Wort, versteckt ist etwas, das durch den Code erstellt und versteckt für seine eine Referenz auf, was Sie im Code richtig erstellt haben? – Twocode

+0

twocode - nein, sie werden beide durch den Code erstellt, aber der Compiler kann den tatsächlichen Eigenschaftsnamen aus dem Ausdruck erkennen, wodurch die Dinge konsistent mit dem Modell bleiben. Dies wird für das automatische Modellbinden verwendet. –

2

Html.Hidden und Html.HiddenFor zum Generieren von Name-Wert-Paaren, die nach der Aktionsmethode im Controller gewartet haben. Beispielverwendung (*):

@using (Html.BeginForm("RemoveFromCart", "Cart")) { 
        @Html.Hidden("ProductId", line.Product.ProductID) 
        @Html.HiddenFor(x => x.ReturnUrl) 
        <input class="btn btn-sm btn-warning" 
          type="submit" value="Remove" /> 
       } 

Wenn Ihre Aktion-Methode für warten „ProductId“ Sie haben diesen Namen in Form zu erzeugen, über Verwendung von (Html.Hidden oder Html.HiddenFor) Für den Fall ist es nicht möglich, Um diesen Namen mit einem stark typisierten Modell zu erzeugen, schreiben Sie einfach diesen Namen mit einem String, der "ProductId" ist.

public ViewResult RemoveFromCart(int productId, string returnUrl){...} 

Wenn ich Html.HiddenFor geschrieben hatte (x => line.Product.ProductID), würde der Helfer ein verstecktes Feld mit dem Namen "line.Product.ProductID" machen. Der Name des Felds stimmt nicht mit den Namen der Parameter für die Aktionsmethode "RemoveFromCart" überein, die auf den Namen "ProductId" warten. Dies würde verhindern, dass die Standardmodellbinder funktionieren, sodass das MVC Framework die Methode nicht aufrufen kann.

* Adam Freeman (Apress - Pro ASP.Net MVC 5)

3

Html.Hidden ('name', 'value') erstellt ein verstecktes Tag mit name = 'name' und value = 'Wert'.

Html.HiddenFor (x => x.nameProp) erstellt ein verstecktes Tag mit einem Namen = 'nameProp' und value = x.nameProp.

Auf den Nennwert scheinen diese ähnliche Dinge zu tun, mit einer nur bequemer als die andere. Aber sein tatsächlicher Wert ist für Modellbindung. Wenn MVC versucht, das HTML mit dem Modell zu verbinden, muss es den Namen der Eigenschaft haben, und für Html.Hidden haben wir 'name' und nicht 'nameProp' gewählt, und daher würde die Bindung nicht funktionieren. Sie müssten ein benutzerdefiniertes Bindungsobjekt haben oder die Werte aus den Formulardaten abrufen. Wenn Sie die Seite erneut anzeigen, müssen Sie das Modell erneut auf die Werte festlegen.

So können Sie Html.Hidden verwenden, aber wenn Sie den Namen falsch erhalten, oder wenn Sie den Eigenschaftsnamen im Modell ändern, schlägt die automatische Bindung fehl, wenn Sie das Formular absenden. Wenn Sie jedoch einen typgeprüften Ausdruck verwenden, erhalten Sie Code-Vervollständigung, und wenn Sie den Eigenschaftsnamen ändern, erhalten Sie einen Fehler bei der Kompilierung. Und dann haben Sie garantiert den richtigen Namen im Formular.

Eine der besseren Eigenschaften von MVC.

Verwandte Themen