2012-05-20 11 views
9

Więc chcę utworzyć wielokrotnego użytku widok na edycję adres, numer telefonu itpMVC4 Częściowy widok nie ładuje wartości do „pojemnik” modelu na stanowisku z powrotem

I konfiguracji modelu pojemnika, który zawiera wszystkie Modele potrzebne. Utworzono częściowy widok obsłużyć część adres th formy

e ale kiedy księguje powrotem do kontrolera, dane klienta jest tam od strony głównej, ale nic z częściowym widokiem tam nie ma (za pomocą MVC4/Razor)

Pojemnik model

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; } 
} 

Kontroler:

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); 
} 

Widok główny:

@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> 
} 
..... 

Adres Częściowy Widok:

@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> 

Co robię źle tutaj - dlaczego nie mogę dostać model zaludnionych z częściowym widokiem?

+1

Jeśli samodzielnie odpowiedziałeś na to pytanie, podaj odpowiedź (PONIŻEJ) i zaakceptuj ją, aby pytanie było oznaczone Odpisano. – kingdango

+0

@Nayt, kingdango ma rację. Proszę przenieść część pytania oznaczoną "SOLVED IT" jako nową odpowiedź poniżej. Po wykonaniu tej czynności oznacz go jako zaakceptowaną odpowiedź. Jednym świetnym rezultatem tego jest to, że inni mogą również uznać Twoją odpowiedź za przydatną; jeśli to zrobią, odpowiedzą na twoją odpowiedź, co jest jedną z fajnych rzeczy na temat uczestnictwa w tej witrynie. –

+0

Myślę, że lepiej użyć edytora EditorTemplate dla tego typu adresu. Pozwoli to uniknąć kłopotów z utrzymaniem kodu w przyszłości. –

Odpowiedz

12

ROZWIĄŚLIŁ TO! Rozgryzłem to! Nie mogłem spać i po prostu się na to natknąłem!

W widoku należy się upewnić, że HtmlFieldPrefix używa tej samej nazwy, co w klasie modelu złożonego, dlatego że nazwałem dwa adresy jako "MainAddress" i "ShippingAddress" - wystarczy upewnić się, że ta sama nazwa jest używany podczas konfigurowania częściowego:

@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

Miałem dokładnie ten problem i natknąłem się na ten post, zanim sam zadałem podobne pytanie. Robiłem wszystko, co było oprócz tego, że w moim @ Html.Partial ("Address", Model.ShippingAddress) nie używałem trzeciego parametru wejściowego ViewDataDictionary i miałem ten sam problem, który miałeś na poczcie zwrotnej. Dlaczego ta część ViewDataDictionary "jest wymagana" - w moim przypadku mam tylko jeden typ adresu, a nie wiele typów takich jak Ty - więc wystarczy powiedzieć "Model.MainAddress" powinien wystarczyć w moim przypadku, wyobrażam sobie? (Tak, wszystko działało dobrze po uwzględnieniu tego trzeciego parametru wejściowego). –

+0

Nawet jeśli masz tylko jeden adres - trzeci parametr nadal informuje kod, która właściwość twojego widoku zawiera adres, w tym przypadku "MainAddress" jest właściwością widoku zawierającego obiekt AddressView ... –

+0

To dobra robota dzięki za uratowanie mnie dzień ... – user1811801

Powiązane problemy