2009-05-30 10 views
0

Wenn Sie über ein ASP.Net MVC-Formular verfügen, das von Html.BeginForm() erstellt wird, wie werden Felder darin ausgefüllt? Im Fall vonWie sind Formulare in ASP.Net MVC vorbelegt?

<asp:Content ID="Main" ContentPlaceHolderID="MainContent" runat="server"> 
<h2>Edit Dinner</h2> 
<%= Html.ValidationSummary("Please correct the errors and try again.") %> 
<% using (Html.BeginForm()) { %> 
    <p> 
     <label for="Title">Dinner Title:</label> 
     <%= Html.TextBox("Title") %> 
     <%= Html.ValidationMessage("Title", "*") %> 
    </p> 

Woher kommt der Wert für Html.TextBox ("Titel")? Ich weiß, das Modell. Und in diesem Fall hat das Modell ein Titelfeld. Aber ich habe Fälle, in denen ich einen View-Modell zu schaffen haben, so habe ich am Ende mit etwas, wie:

public class DinnerViewModel { 
    public Dinner Dinner {get; set;}; 
    public SomethingElse SomethingElse {get; set;}; 
} 

und verwenden, die als Modell, das <% = Html.TextBox („Title“)%> die bekommt richtiger Wert. Oder zumindest, wenn die Validierung fehlschlägt und das Formular erneut angezeigt wird.

Ich frage, weil ich einen Fall eines Formulars haben, das über AJAX (unter Verwendung von Ajax.BeginForm()) gesendet wird, und das Formular wird aktualisiert. Ich erstelle ein neues Modellobjekt, leer, dafür, aber es lädt immer noch die Werte der letzten Einreichung. Wenn ich ohne AJAX absende, funktioniert alles gut.

aktualisieren

ich in der Vorlage den Debugger gucke. Model.Dinner.Title ist gleich "" und Html.TextArea ("Title", Model.Dinner.Title) setzt den vorherigen Wert, der innerhalb des Textbereichs gesendet wurde.

Antwort

2

Die Daten werden im ModelState gespeichert. Die HtmlHelper-Methoden suchen nach Werten, die im Modellstatus basierend auf dem Namen des Formularelements gespeichert wurden. Der ModelState wird gereinigt, wenn ich weiterleite, aber nicht, wenn ich gerade zurückkomme, wie im Falle des AJAX-Anrufs.

0

Sie können auch die Werte zwingen, leer zu sein:

<% =Html.TextBox("Title", null, new { @value = '' }); %> 

Es wäre besser, wenn ein leeres Modell (Standardwerte) an die Ansicht übergeben? EDIT Das ist, was Sie tun, was ich sehe;). Gehen Sie einfach zu meinem ersten Vorschlag, überprüfen Sie, ob die Anfrage eine AJAX-Anfrage ist oder nicht, und übergeben Sie dann den empty @ value an die TextBox.

+0

Ich übergebe ein leeres Modell zur Ansicht. – Pablo

0

Ich bin mir nicht sicher, ob ich das Problem verstehe. Sie führen eine Ajax-Anfrage durch, aber die Textfelder in Ihrem Formular behalten ihre Werte nach dem Anruf?

Wenn das der Fall ist, sollten Sie überprüfen, dass sich dieses Textfeld in dem Element befindet, das der UpdateTargetId-Eigenschaft der AjaxOption-Klasse zugeordnet ist. Wenn Sie eine Ajax-Anfrage ausführen, wird nur ein Teil Ihrer Seite aktualisiert (der von der Eigenschaft UpdateTargetId referenzierte). Der Rest der Felder auf Ihrer Seite wird nicht aktualisiert, unabhängig davon, ob Sie Ihr Modell aktualisieren oder nicht. Schauen Sie sich dieses Beispiel:

<%= Html.TextBox("Title") %> 
.... 
<div id="myDiv"> 
    <%= Html.TextBox("SomeField") %> 
</div> 

<% using (Ajax.BeginForm(new AjaxOptions() { UpdateTargetId = "myDiv" })) {%> 
    //... blah blah blah 
<% } %> 

Wenn Sie Ihre Ajax-Formular einreichen, wird nur somefield Feld aktualisiert werden, wird Feld Titel unverändert bleiben.

Wenn Sie ein reguläres Formular senden, wird die ganze Seite aktualisiert und deshalb werden alle Felder ohne Ajax aktualisiert.

EDIT: Typo.