ASP.NET MVC 3 Modellbindungs- und Formularfelder

8

Ich habe eine Entität namens Domain.Models.BlogPost , die folgende Eigenschaften enthält:

  • PostID
  • Titel
  • Autor
  • PostedDate
  • Körper

Ich habe auch eine Entität namens Domain.Models.PostComment , die folgende Eigenschaften enthält:

  • Kommentar-ID
  • PostID
  • Autor
  • E-Mail
  • Website
  • Körper

BlogPost enthält viele PostComments . Eine Eins-zu-viele-Beziehung.

Jetzt habe ich eine Ansicht wie diese (getrenntes Kommentarformular aus Blogpostcode über HTML-Kommentar):

%Vor%

Da das Kommentarformular @Html.TextBox("Author") und @Html.TextBox("Body") verwendet, ist das Problem, dass sie mit Daten aus dem Modell gefüllt werden, die auch die Eigenschaften Author und Body enthalten. Irgendwelche Vorschläge, wie Sie das beheben können, damit diese Felder keine Werte erhalten, wenn die Seite geladen wird?

Ich habe auch versucht, ein BlogPostViewModel zu erstellen und dieses als Modell der Ansicht festzulegen und die Eigenschaft BlogPost mit meinem tatsächlichen Modell zu verknüpfen:

%Vor%

Dann habe ich @Html.TextBoxFor(x => x.NewComment.Author) , aber wenn das Formular an diese Aktionsmethode gepostet:

%Vor%

postComment hat nicht an die Formularwerte gebunden: /

    
Chev 17.03.2011, 16:16
quelle

3 Antworten

6

Sie könnten die Felder im Abschnitt AddComment entweder in Objekte umbenennen, die nicht mit den im Modell angegebenen Eigenschaften kollidieren, oder Sie können den Wert in der Ansicht mit einer anderen Überladung von Html.TextBox Diese Überladung von TextBox dauert ein value :

  

value (Typ: System.Object)
      Der Wert des Texteingabeelements. Wenn dieser Wert null ist, wird der Wert des Elements vom ViewDataDictionary-Objekt abgerufen. Wenn dort kein Wert vorhanden ist, wird der Wert vom ModelStateDictionary-Objekt abgerufen.

UPDATE: Da Sie "NewComment" als Eigenschaft hinzugefügt und die Kollision der Objektnamen aufgelöst haben, müssen Sie lediglich das Modell anweisen, um PostComment und nicht das gesamte Ansichtsmodell an POST zu binden Binder, dass ein Präfix verwendet wird. Dies geschieht mit BindAttribute .

%Vor%     
Adam Price 17.03.2011, 16:21
quelle
1

Verwenden Sie ASP NET MVC-Vorlagen, damit Sie die volle Kontrolle darüber haben, was aufgefüllt und typsicher ist.

Sie würden also eine .ascx Vorlage erstellen, die eine stark typisierte Comment benötigt. In Ihrem Modell, lassen Sie einen leeren da drin.

    
Aliostad 17.03.2011 16:22
quelle
0

Gibt es keine Überladung auf TextBox , die einen Wert annimmt? Sie könnten einfach string.Empty ...

übergeben     
Jakub Konecki 17.03.2011 16:20
quelle