Ok, ich werde versuchen, Sie 90% des Weg dorthin zu bekommen. Dies ist eigentlich ein großer und komplexer Teil von MVC 2 und in dieser Antwortbox fast unmöglich zu beantworten.
Jetzt sollten Sie zuerst zum Brad Wilsons Blog gehen und ausführlich lesen, wie Sie die Standard-MVC 2-Vorlagen anpassen können. Das sollte Ihnen ein viel klareres Verständnis aller beweglichen Teile geben.
http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html
Jetzt werde ich ein einfaches Beispiel beginnen, wie ein erfundenen Termin View-Modell zu schaffen, in dem wir geliefert, dass die Werten machen wollen in der Zeit nicht zurückgehen. Achte jetzt nicht auf die Attribute, wir werden es schaffen.
Hier ist das Viewmodel Ich verwende:
public class AppointmentViewModel
{
[Required]
public string Name { get; set; }
[CantGoBackwardsInTime]
public DateRange DateRange { get; set; }
}
public class DateRange
{
public DateTime Start { get; set; }
public DateTime End { get; set; }
[Required]
public int Price { get; set; }
}
Und ich habe dies auf die Standardhomecontroller (nichts Besonderes) hinzugefügt:
public ActionResult Appointment()
{
return View(new AppointmentViewModel());
}
[HttpPost]
public ActionResult Appointment(AppointmentViewModel appointment)
{
return View(appointment);
}
Und hier ist meine Ansicht:
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Appointment
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Add Appointment</h2>
<%= Html.ValidationSummary() %>
<% using(Html.BeginForm()) { %>
<%= Html.EditorForModel() %>
<input type="submit" value="Save Changes" />
<%} %>
</asp:Content>
Schritt 1: Einstellen der Bühne
Das erste, was Sie tun möchten, ist die "Standardvorlagen" aus dem Blog-Eintrag zu greifen. Die wichtigste in diesem Fall ist die, die in /Views/Shared/EditorTemplates/Object.asxc sitzt. Object.ascx ist der Schlüssel für die gesamte Operation. Alle Html.Editor ***** Methoden werden dies eventuell aufrufen.
nun das erste Stück der Standardfunktionalität müssen wir ändern, ist diese Linie innerhalb von Object.ascx
<% if (ViewData.TemplateInfo.TemplateDepth > 1) { %>
<%= ViewData.ModelMetadata.SimpleDisplayText%>
<% }
Was das ist, sagen ist, „nicht alle verschachtelten komplexen Typen angezeigt werden“ und wir wollen nicht, Das. Ändern Sie das> 1 in ein> 2. Nun sehen Sie Modelle in Ihrem Objektdiagramm, für die Vorlagen erstellt werden, anstatt nur Platzhaltertext zu erstellen.
Halten Sie einfach alles andere Standard für jetzt.
* Schritt 2: Übergeordnete Vorlagen **
Wenn Sie die Blog-Einträge lesen hoffentlich werden Sie jetzt verstehen, wie der Editor *** und Anzeigemethoden werden automatisch die Vorlagen in View/Shared/EditorTemplates anrufen und DisplayTemplates . Betrachten Sie sie als Aufruf von Html.RenderPartial ("TYPENAME", MyType) sie sind nicht aber es ist nah genug im Konzept.
Also, wenn Sie die Lösung so weit und gehen Sie zur richtigen URL, werden Sie feststellen, dass MVC 2 Object.ascx zweimal aufrufen wird, einmal für Ihr AppointmentViewModel und erneut für die Eigenschaft DateRange. Out of the Box rendert nur die gleiche Sammlung von Formularfeldern.
Sagen wir, wir möchten, dass unsere Vorlage unseren DateRange-Editor mit einer rot umrandeten Box umgibt. Was wir tun möchten, ist MVC 2, um eine benutzerdefinierte DateTime.ascx Vorlage anstelle von Object.ascx aufzurufen und das ist so einfach wie das Hinzufügen unserer eigenen Vorlage in View/Shared/EditorTemplates/DateRange.ascx. In diesem Fall habe ich genommen genau das, was von Object.ascx generiert wurde mit unserem Modell Daterange arbeiten und nur den Code in ein neues DateRange.ascx eingefügt:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<div style="border: 1px solid #900">
<div class="editor-label"><label for="DateRange">DateRange</label></div>
<div class="editor-field">
<div class="editor-label"><label for="DateRange_Start">Start</label>
</div>
<div class="editor-field">
<input class="text-box single-line" id="DateRange_Start" name="DateRange.Start" type="text" value="" />
</div>
<div class="editor-label"><label for="DateRange_End">End</label></div>
<div class="editor-field">
<input class="text-box single-line" id="DateRange_End" name="DateRange.End" type="text" value="" />
</div>
<div class="editor-label"><label for="DateRange_Price">Price</label></div>
<div class="editor-field">
<input class="text-box single-line" id="DateRange_Price" name="DateRange.Price" type="text" value="" />
</div>
</div>
</div>
Wala!
Jetzt, wenn Sie die Lösung ausführen, sollten Sie eine rote Box um unseren DateRange sehen. Der Rest der Anpassungen liegt bei Ihnen! Sie könnten jQuery-Datepicker-Boxen hinzufügen. In Ihrem Fall könnten Sie beide Felder in ein einzelnes Div setzen, so dass sie horizontal ausgerichtet sind. Der Himmel ist an dieser Stelle die Grenze.
Schritt 3: Validierung:
Validation ziemlich genau so funktioniert, man erwarten würde. Ein [Required] -Attribut in Ihrem DateRange-Typ funktioniert genauso wie jedes andere Validierungsattribut.
Jetzt sehen Sie, ich habe eine nicht rückwärts in der Zeit Attribut gehen kann, die ich auf dem Daterange Eigenschaft AppointmentViewModel gesetzt haben.
public class CantGoBackwardsInTime : ValidationAttribute
{
public override string FormatErrorMessage(string name)
{
return "Your date range can't go backwards in time";
//return base.FormatErrorMessage(name);
}
public override bool IsValid(object value)
{
if (!(value is DateRange))
throw new InvalidOperationException("This attributes can only be used on DateRange types!");
var dateRange = value as DateRange;
return dateRange.End > dateRange.Start;
}
}
Nun, wenn Sie diese Ihre Immobilie hinzu und dekorieren Sie die Fehlermeldung in der benutzerdefinierten CantGoBackwardsInTime Validierung Attribut versehen sehen sollte: Alles, was Sie diese typspezifischen Validierungsattribute wird erben und implementieren die Basis Validation zu schaffen haben zu tun.
Ich werde aktualisieren und mehr davon löschen, wenn Sie irgendwelche Probleme haben, aber diese sollten Sie und auf dem Weg zu beginnen. (Ich dachte mir, ich könnte das vor dem Schlafengehen austesten) Nur eine Warnung: Der neue Editor für Teile von MVC 2 ist das Beste, was es auf der Welt gibt und hat ein riesiges Potential, MVC 2 Super RAD Fähigkeiten zu verleihen; Doch neben Brad Wilsons Blog gibt es kaum Informationen. Bleiben Sie einfach dabei und haben Sie keine Angst, den MVC 2-Quellcode zu sehen, wenn Sie es auch brauchen.
„aber bisher habe ich bei der Suche nach geeigneten Lösungen wenig Glück gehabt.“ Was bedeutet das? – jfar
Hi jfar, ich bin ziemlich neu in C# und mvc und habe mich daher auf Google-Suchen verlassen, um einen guten Ausgangspunkt für eine Lösung zu finden. Die wichtigste davon ist http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx gewesen, aber ich kann nicht herausfinden, wie die Validierung (Server-Seite oder Client-Seite) hinzuzufügen. –
Oh ok, ich dachte es wäre etwas anderes. Wenn nicht jemand anders antwortet, werde ich heute Nacht eine Antwort schreiben. Ich mache diese Art von Ding die ganze Zeit. – jfar