2012-04-03 11 views
3

Ich versuche derzeit herauszufinden, wie Sie mehrere Felder in einer MVC 3-Ansicht an 1 -Eigenschaft in einem Ansichtsmodell binden können und was beim Versuch empfohlen wird Dies.Mehrere Felder mit derselben Eigenschaft eines MVC 3-Ansichtsmodells verbinden

Verwenden Sie ein Beispiel für die Anzahl der Minuten (nur), die es braucht, um etwas vorzubereiten.

Die Form könnte wie folgt aussehen:

Vorbereitungszeit - Stunden: [1] Minutes: [30]

und die übermittelten Formularwerte müssen in Minuten und gebunden an die PreparationTimeInMinutes Eigentum umgewandelt werden des ViewModels.

Ansichtsmodell Eigenschaft:

public short PreparationTimeInMinutes { get; set; } 

und die Aussicht ist stark an das Ansichtsmodell eingegeben und hat derzeit die folgenden:

<div class="editor-label"> 
    @Html.LabelFor(model => model.PreparationTimeInMinutes) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.PreparationTimeInMinutes) 
    @Html.ValidationMessageFor(model => model.PreparationTimeInMinutes) 
</div> 

Hier ein paar Dinge, die ich über, um nachzudenken begann zu erreichen Dies.

  1. Ändern die PreparationTimeInMinutes Eigenschaft auf ein Ansichtsmodell, das eine Stunde & Minute Eigenschaft hat und Editor und Anzeigevorlagen dafür schaffen, so dass MVC3 kann die Bindung und Validierung aussortieren?
  2. Verwenden Sie Javascript und ein verstecktes Feld für die Vorbereitungszeit.
  3. Ein anderer Ansatz, mit dem Sie die MVC-Modellbindung verwenden können, um so etwas zu tun?

Hat jemand irgendwelche Vorschläge für Best Practice für diese Art von Sache? oder wenn ich weit weg bin.

Bitte lassen Sie es mich wissen. Danke

Antwort

1

Sie sollten die erste Option verwenden.
Genau dafür werden Editor-Vorlagen erstellt.

Wenn Sie möchten, können Sie einen benutzerdefinierten ModelBinder erstellen, um zwei POSTed-Werte (zusammen mit einer ähnlichen Editorvorlage) an eine einzelne Zahl zu binden und ein Attribut auf die Eigenschaft anzuwenden, um diesen ModelBinder auszuwählen.
Allerdings wäre das wahrscheinlich übertrieben.

+0

Wie kann ich zwei Werte binden, während die SetProperty-Methode nur einmal aufgerufen wird unter Berücksichtigung der Reihenfolge der übermittelten Daten, habe ich einige Probleme in dieser [Frage] [http://stackoverflow.com/questions/19914955/ map-multiple-fields-to-a-property-while-binding-the-property] – Hilmi

0

Danke SLaks.

die erste Option verwendet ich die unten in meiner Ansicht nach Modell tat

public TimeInMinutesViewModel PreparationTimeInMinutes { get; set; } 

Aus dieser Ansicht Modell

public class TimeInMinutesViewModel { 
    public string Label { get; set; } 
    public short Hours { get; set; } 
    public short Minutes { get; set; } 
} 

und diese Editor-Vorlage

@model TimeInMinutesViewModel 

<div>@Html.LabelFor(x => x.Label)</div> 
<div class="editor-label">@Html.LabelFor(x => x.Hours)</div> 
<div class="editor-field">@Html.EditorFor(x => x.Hours)</div> 
<div class="editor-label">@Html.LabelFor(x => x.Minutes)</div> 
<div class="editor-field">@Html.EditorFor(x => x.Minutes)</div> 

und in der Ansicht

@Html.EditorFor(model => model.PreparationTimeInMinutes) 
@Html.ValidationMessageFor(model => model.PreparationTimeInMinutes) 

Ich habe dies noch nicht getestet und ich muss möglicherweise einige Änderungen für die Etiketten vornehmen, aber es sieht so aus, als könnte es für 2 verschiedene Eigenschaften funktionieren, für die ich diesen Ansatz verwenden möchte.

Das Problem, das ich jetzt habe, ist in der Lage, diese auf meine Entity-Eigenschaft, die eine kurze int ist abzubilden.

ich verwende AutoMapper so bin ich die Hoffnung, diese mit einem benutzerdefinierten Typ-Wandler arbeitet, zumindest in 1 Richtung, aber ich bin mir nicht sicher über beiden Richtungen :(

2

Die Javascript ist nicht schlecht, aber nicht wirklich Ich würde denken, der bessere Ansatz wäre ein Ansichtsmodell mit diesen beiden Feldern oder eine neue Klasse mit den Editor/Display-Vorlagen zu machen.

Ich stimme mit SLaks, Sie können ein benutzerdefiniertes Modell Binder erstellen, um dies zu handhaben, aber es ist wahrscheinlich Overkill.Ich habe eine benutzerdefinierte Binder für einen Typ mit einem Datum und zwei Mal basierend auf this article erstellt, obwohl meins viel einfacher ist.Wenn Sie nur die Praxis wollen oder mehr über Modell Bindi lernen ng, es ist machbar.

EDIT: Entschuldigung, nur für den Fall, dass Sie sich für die ModelBinder-Route entscheiden, ist dieses Beispiel ein wenig alt (vielleicht MVC 1 ?!). Ich habe vergessen, zusätzliche Änderungen vornehmen zu müssen. Theselinks sollte helfen, dieses Beispiel zu aktualisieren. Viel Glück.

+0

Schön für den Artikel, ja, ich muss ein paar Custom Model Binding versuchen, hoffentlich werden die Templates aber fürs Erste funktionieren. Vielen Dank – Pricey

Verwandte Themen