2014-02-26 15 views
5

Entschuldigung, wenn dies zuvor beantwortet wurde, kann ich nichts finden, das zu meinem Problem passt.MVC-Formular mit Teilansicht senden

Ich habe eine Ansicht, die eine Teilansicht enthält, und beim Senden der Ansicht werden die Daten aus der Teilansicht nicht an die Steuerung gesendet. Ich verstehe, dass wenn ich eine Editor-Vorlage verwende, sollte dies funktionieren, aber ich kann dies nicht verwenden, da ich Daten von meinem Hauptmodell innerhalb der Partial benötigen.

Meine Ansicht erstellen (vereinfacht):

@model CreateXmlSchemaModel 
@using (Html.BeginForm("Create", "XmlSchema", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <fieldset> 
     <div class="editor-label"> 
      @Html.LabelFor(m => m.XmlSchema.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(m => m.XmlSchema.Name) 
     </div> 
     <div id="fieldmapping"> 
      @Html.Partial("_XmlFieldMapping") 
     </div> 
     <div> 
      <input type="submit" value="Create" class="button" /> 
     </div> 
    </fieldset> 
} 

Meine Modellstruktur (vereinfacht):

public abstract class XmlSchemaModelContainerBase 
{ 
    public IEnumerable<string> BusinessObjects { get; set; } 
    public IEnumerable<XmlInputFieldModel> XmlFields { get; set; } 
    public IEnumerable<string> BusinessObjectFields { get; set; } 
} 

public class XmlSchemaModelContainer : XmlSchemaModelContainerBase 
{ 
    public XmlSchemaModel XmlSchema { get; set; } 
} 

public class XmlSchemaModel 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public string BusinessObject { get; set; } 
    public IEnumerable<XmlSchemaField> MappedFields { get; set; } 
} 

public class XmlSchemaField 
{ 
    public string XmlElement { get; set; } 
    public string BusinessObjectField { get; set; } 
} 

public class XmlInputFieldModel 
{ 
    public string XmlElement { get; set; } 
    public string XmlValue { get; set; } 
} 

public class CreateXmlSchemaModel : XmlSchemaModelContainer 
{ 
    [Required(ErrorMessage = "File upload required")] 
    public HttpPostedFileBase Xml { get; set; } 
} 

Mein Controller (Ich werde es nicht post alle, wie ich sofort sagen kann, dass mein Ansichtsmodell nicht enthält die MappedFields):

[HttpPost] 
public ActionResult Create(CreateXmlSchemaModel viewModel) 
{ 
} 

Mein _XmlMappedFields Teilansicht:

@model CherwellXmlConnector.Models.XmlSchemaModelContainer 
@{ 
    Model.XmlSchema.MappedFields = Model.XmlSchema.MappedFields.OrderBy(i => i.XmlElement); 
} 

<div> 
    <div> 
     @for(int i = 0; i < @Model.XmlFields.Count(); i ++) 
     { 
      List<CherwellXmlConnector.Models.XmlSchemaField> fields = Model.XmlSchema.MappedFields.ToList(); 
      string itemValue = Model.XmlFields.FirstOrDefault(x => x.XmlElement == fields[i].XmlElement).XmlValue; 

      <div style="width: 300px; display: inline-block;"> 
       @Html.DisplayFor(x => fields[i].XmlElement) 
      </div> 
      <div style="width: 300px; display: inline-block;"> 
       @itemValue 
      </div> 
      <div class="busoblist" style="display: inline-block;"> 
       @Html.DropDownListFor(x => fields[i].BusinessObjectField, new SelectList(Model.BusinessObjectFields)) 
      </div> 
      <hr /> 
     } 
    </div> 
</div> 

Meine Absicht ist es, den Anwender in die teilweise eine Liste aller gegebenen XmlFields und deren Werte angezeigt werden, und lassen Sie sie für jeden XMLField eine BusinessObjectField aus einem Dropdown auswählen. Ich möchte dann diese zurück an den Controller innerhalb der IEnumerable<XmlSchemaField> MappedFields Objekt gesendet. Ist das möglich?

+0

Im Allgemeinen ist es möglich, Formulare mit Teilansichten einzureichen. Schwierig, Ihre Frage zu beantworten, ohne zu sehen 1. Ihr Controller, 2. Welche Art von Klasse 'XmlInputFieldModel'. Können Sie das provozieren? – Nilzor

+0

Auch das Anzeigen des für die Teilansicht generierten HTML wäre hilfreich. Für dich selbst wäre es auch hilfreich, Fiddler zu verwenden, um die POST-Daten zu debuggen. – Nilzor

+0

@Nilzor, ich habe die fehlenden Klassen für dich hinzugefügt – Mark

Antwort

4

Ja, es ist möglich.

Das Problem, mit dem Sie konfrontiert sind, hängt davon ab, wie Modellbindung funktioniert. Wenn es nur ein primitive type ist, versuchen Sie, für die IEnumerable zu binden, dann hätte es gut funktioniert.

@foreach(var item in @Model.XmlSchema.MappedFields) 
    { 
     string itemValue = Model.XmlFields.FirstOrDefault(x => x.XmlElement == item.XmlElement).XmlValue; 
     <div style="width: 300px; display: inline-block;"> 
      @Html.DisplayFor(i => item.XmlElement) 
     </div> 
     <div style="width: 300px; display: inline-block;"> 
      @itemValue 
     </div> 
     <div class="busoblist" style="display: inline-block;"> 
      @Html.DropDownListFor(i => item.BusinessObjectField, new SelectList(Model.BusinessObjectFields)) 
     </div> 
     <hr /> 
    } 

wenn Sie einen Blick auf den Quellcode nehmen von dem obigen Code erzeugt, werden Sie alle der dropdowns (select Tags) sehen erzeugt aus den obigen Code den gleichen Namen hat. Aus diesem Grund wird es beim Senden des Formulars nicht ordnungsgemäß an Ihr Modell gebunden.

Es folgt eine gute Blog-Post, die ich als sehr nützlich und es erklärt dazu im Detail

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

UPDATE

Für diejenigen von euch, die hierher kommen nach einer Antwort suchen Daten in eine Liste posten, habe ich einen Blogbeitrag geschrieben. http://amilaudayanga.wordpress.com/2014/03/05/posting-data-to-a-list-in-asp-net-mvc-part1/

+1

Nur dazu: Ändere die foreach-Schleife zu einer for-Schleife und benutze old-school Indizierung, und Sie werden gut gehen. – Nilzor

+0

@Amila Danke dafür, und ich habe den Artikel durchgearbeitet, aber ich muss eine letzte Bindung oder etwas fehlen, da es immer noch nicht zum Controller kommt. Ich habe meinen Beitrag oben mit den Änderungen aktualisiert, die ich vorgenommen habe. – Mark

+0

'@ Html.Partial (" _ XmlFieldMapping ")' Sie übergeben das Modell nicht an das Partielle.Sie sollten das Objekt übergeben, das vom Typ 'CherwellXmlConnector.Models.XmlSchemaModelContainer' ist. – Amila