Ich bin wirklich neu in ASP.NET MVC und im Grunde alles Web bezogen. Sorry, wenn dies nooby ist, aber ich versuche, dies zu tun:Bind ViewModel -Eigenschaft von Teilansicht zu Hauptansicht
Ich habe ein Ansichtsmodell mit einer komplexen Objekt (Navigation hier):
public class Request
{
public virtual BaseRequestData RequestData { get; set; }
}
BaseRequestData abstrakt ist, aber ein paar Klassen von ihm geerbt, die haben andere Attribute wie diese:
public class AcceleratorRequestData : BaseRequestData
{
[Display(Name="Downside amount")]
[Range(-100,0,ErrorMessage = "Downside participation must be between 0 and -100")]
[Required]
public decimal PutNotional { get; set; }
[Display(Name="Upside strike")]
[Range(1, 2, ErrorMessage = "Upside strike must be between 100% and 200%")]
public decimal CallPercentStrike { get; set; }
}
auf meinem Haupt ‚erstellen‘ Ansicht, die ich auf meine Anfrage Modell binden, aber ich mag eine Teilansicht für meine BaseRequestData machen von der Art abhängig ist (zum Beispiel AcceleratorRequestData) über den Benutzer aus einem Dropdown-Menü auswählen. Was ich versucht habe verwendet einige jQuery, um einen Controller aufzurufen und eine Teilansicht abhängig von der Dropdown-Liste zu rendern. Hier ist eine meiner Teilansichten, die eine Reihe von Form-Gruppen ist:
@model Synapse.Models.AcceleratorRequestData
@Html.ValidationSummary(true,"",new {@class = "text-danger"})
<div class="form-group">
@Html.LabelFor(m => Model.PutNotional, new {@class = "control-label col-md-2"})
<div class="col-md-10">
@Html.EditorFor(model => model.PutNotional, new {htmlAttributes = new {@class = "form-control"}})
@Html.ValidationMessageFor(model => model.PutNotional, "", new {@class = "text-danger"})
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => Model.CallPercentStrike, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.CallPercentStrike, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.CallPercentStrike, "", new { @class = "text-danger" })
</div>
</div>
Welche meinen Platzhalter <div>
in meiner Haupt-Ansicht ersetzt:
@using (Html.BeginHorizontalForm())
{
@Html.AntiForgeryToken()
<hr/>
@Html.ValidationSummary(true, "", new {@class = "text-danger"})
<div id="accelRequestPh" style="display: none;"></div>
<input type="submit" value="Create" class="btn btn-default" />
}
Aber hier meine Validierung Eigenschaften und Bindungen nicht (natürlich, weil mein BaseRequestData-Objekt nicht an die Instanz meines Request-Objekts gebunden ist). Wie kann ich das machen? Soll ich eine Editorvorlage verwenden? Wenn ich es trotzdem tue, wie wird mein Hauptmodell darüber informiert?
Welchen Zweck hat die Klasse 'Request', die' BaseRequest' als virtuelle Eigenschaft enthält? Ich frage, weil Sie das Request-Objekt nirgendwo verwenden (Sie können nicht validieren, was nicht da ist). –
Ich brauche es für die Navigation. Mein übergeordnetes Objekt ist der Typ Request, den ich gerne erzeuge, und jede Anfrage hat ein BaseRequestData-Objekt, das konkret ist. – coolboyjules
Wäre es besser, eine Schnittstelle für Ihre abstrakte Definition zu verwenden und alles, was 'Request' verwendet, stattdessen die Schnittstelle zu verwenden? Ich frage, weil Sie sagen, Ihre Validierung bricht, weil BaseRequest nicht an Request gebunden ist, aber die Art, wie Sie diesen Code entworfen haben, ist schwer zu sagen, was passiert, ohne die gesamte Quelle zu sehen und wie alles Ihre Abhängigkeitskette verbraucht ich es ist). –