2012-05-20 13 views
9

quindi voglio per creare una visualizzazione riutilizzabile per la modifica di un indirizzo, numero di telefono, eccMVC4 Parziale vista non caricando i valori nel modello "contenitore" sul palo

ho messa a punto di un modello di contenitore che contiene tutte le Modelli necessari creato una vista parziale per gestire la parte Indirizzo di Th forma

e Ma quando il postback al controller, i dati dei clienti è là dalla pagina principale, ma nulla dalle viste parziali non c'è (usando MVC4/Razor)

Container Modello

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

Vista principale:

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

Indirizzo Parziale Vista:

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

Che cosa sto facendo di sbagliato qui - perché non posso ottenere il modello popolato dalle viste parziali?

+1

Se si è risposto a questa domanda, si prega di fornire una risposta (SOTTO) e accettarla in modo che la domanda sia contrassegnata Risposta. – kingdango

+0

@Nayt, kingdango ha ragione. Sposta la parte della domanda contrassegnata come "RISOLTO" come una nuova risposta di seguito. Dopo averlo fatto, contrassegnarlo come risposta accettata. Un risultato interessante è che altri potrebbero trovare utile anche la tua risposta; se lo fanno, inviteranno la tua risposta, che è una delle cose divertenti della partecipazione a questo sito. –

+0

Penso che faresti meglio ad usare un EditorTemplate per il tipo di indirizzo qui. Questo ti eviterà un sacco di problemi quando manterrai il tuo codice in futuro. –

risposta

12

RISOLTO! L'ho capito! Non riuscivo a dormire, e appena inciampato su di esso!

Nella vista è necessario assicurarsi che HtmlFieldPrefix utilizzi lo stesso nome della classe del modello composito, quindi dal momento che ho chiamato i due indirizzi come "Indirizzo principale" e "Indirizzo di spedizione", è necessario assicurarsi che lo stesso nome sia viene utilizzato quando si imposta Parziale:

@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

Ho avuto il problema esatto e sono incappato in questo post prima che stavo per fare una domanda simile me stesso. Stavo facendo tutto ciò che eri tranne che nel mio @ Html.Partial ("Indirizzo", Model.ShippingAddress) Non stavo usando il terzo parametro di input ViewDataDictionary, e stavo avendo lo stesso problema che avevi al momento del postback. Perché questa porzione ViewDataDictionary è "richiesta" - nel mio caso ho solo 1 tipo di indirizzo, non più tipi come te - quindi solo dire "Model.MainAddress" dovrebbe essere sufficiente nel mio caso, immagino? (Sì, tutto ha funzionato bene includendo questo terzo parametro di input). –

+0

Anche se si ha un solo indirizzo - il terzo parametro indica ancora al codice quale proprietà della vista contiene l'indirizzo, in questo caso "Indirizzo principale" è la proprietà della vista che contiene un oggetto AddressView ... –

+0

Questo è un buon lavoro grazie per avermi salvato un giorno ... – user1811801

Problemi correlati