2012-05-20 6 views
9

Deshalb möchte ich zum Bearbeiten einer Adresse, die Telefonnummer ein wiederverwendbares Ansicht erstellen usw.MVC4 Teilansicht nicht Werte in „Container“ Modell auf Post back loading

ich Setup ein Container Modell, das alle enthält die Modelle benötigt. eine Teilansicht Geschaffen, um die Adresse Teil th e Form

Aber wenn es postet zurück an den Controller, Kundendaten gibt es auf der Hauptseite, aber alles, was von den Teilansichten zu handhaben ist nicht da (mit MVC4/Razor)

Container Modell

public class CustomerViewModel { 
    public Customer CustomerData { get; set; } 
    public Address MainAddress { get; set; } 
    public Address ShippingAddress { get; set; } 
    public Phone MainPhone { get; set; } 
    public Phone Fax { get; set; } 
} 

Controller:

public ActionResult Edit(int id = 0) { 
    CustomerViewModel model = new CustomerViewModel(); 
    model.CustomerData = Customer.FetchById(id); 
    if (model.CustomerData == null) return HttpNotFound(); 

    //... load addresses, phones 

    return View(model); 
} 

[HttpPost] 
public ActionResult Edit(CustomerViewModel model) { 
    if (ModelState.IsValid) { 
     ///... save everything here - model has CustomerData, but nothing else 
    } 

    return View(model); 
} 

Hauptansicht:

@model ProjectName.WebSite.Models.CustomerViewModel 

..... 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Customer</legend> 
     @Html.HiddenFor(model => model.ModelCustomer.CustomerId) 

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

     ...   

     @Html.Partial("Address", Model.MainAddress, new ViewDataDictionary { 
      TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Main" } 
     }) 

     ...   

     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
} 
..... 

Adresse Teilansicht:

@model ProjectName.Business.Address 

<fieldset style="margin-top: 20px;"> 
    <legend>@(ViewData["label"] ?? "Address")</legend> 

    @Html.HiddenFor(model => model.AddressId) 

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

Was mache ich falsch hier - warum kann ich nicht das Modell aus den Teilansichten bevölkert bekommen?

+1

Wenn Sie diese Frage selbst beantwortet haben, geben Sie bitte eine Antwort (BELOW) an und akzeptieren Sie sie, damit die Frage mit Beantwortet beantwortet wird. – kingdango

+0

@Nayt, Kingdango hat Recht. Bitte verschieben Sie den Teil Ihrer Frage, der mit "SOLVED IT" gekennzeichnet ist, als neue Antwort unten. Bitte markieren Sie dies als akzeptierte Antwort. Ein cooles Ergebnis dabei ist, dass andere Ihre Antwort auch nützlich finden; Wenn sie dies tun, werden sie Ihre Antwort positiv bewerten, was eine der lustigen Seiten der Teilnahme an dieser Website ist. –

+0

Ich denke, Sie sollten besser ein EditorTemplate für den Adresstyp hier verwenden. Dies würde Ihnen viele Probleme bei der zukünftigen Pflege Ihres Codes ersparen. –

Antwort

12

Gelöste IT! Ich habe es herausgefunden! Konnte nicht schlafen und stolperte nur darüber!

In der Ansicht müssen Sie sicherstellen, dass das HtmlFieldPrefix den gleichen Namen wie in Ihrer Composite-Modell-Klasse verwendet, also da ich die beiden Adressen als "MainAddress" und "ShippingAddress" nannte - müssen Sie nur den gleichen Namen wird verwendet, wenn das Partial eingerichtet wird:

@Html.Partial("Address", Model.MainAddress, new ViewDataDictionary(Html.ViewDataContainer.ViewData) { 
    TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "MainAddress" } 
}) 

@Html.Partial("Address", Model.ShippingAddress, new ViewDataDictionary(Html.ViewDataContainer.ViewData) { 
    TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "ShippingAddress" } 
}) 
+0

Ich hatte das genaue Problem und stolperte über diesen Beitrag, bevor ich selbst eine ähnliche Frage stellen wollte. Ich tat alles, was Sie außer dem in meinem @ Html.Partial waren ("Address", Model.ShippingAddress) Ich verwendete nicht den dritten ViewDataDictionary Eingabeparameter und hatte das gleiche Problem, das Sie beim Postback hatten. Warum ist dieser ViewDataDictionary-Teil "erforderlich" - in meinem Fall habe ich nur einen Adresstyp, nicht mehrere Typen wie Sie selbst - also würde einfach "Model.MainAddress" in meinem Fall genügen, würde ich mir vorstellen? (Ja, alles hat gut funktioniert, nachdem dieser dritte Eingabeparameter hinzugefügt wurde). –

+0

Obwohl Sie nur eine Adresse haben - der dritte Parameter teilt dem Code immer mit, welche Eigenschaft Ihrer Ansicht die Adresse enthält, in diesem Fall ist "MainAddress" die Eigenschaft der Ansicht, die ein AddressView-Objekt enthält ... –

+0

Das ist eine gute Arbeit Danke, dass du mir einen Tag gerettet hast ... – user1811801

Verwandte Themen