2011-03-04 11 views
41

mam 2 modele w mojej próbce MVC 3 aplikacji SimpleModel i ComplexModel, przedstawiono poniżej:złożonych modeli i częściowe widoki - model kwestia wiąże w ASP.NET MVC 3

public class SimpleModel 
{ 
    public string Status { get; set; } 
} 

public class ComplexModel 
{ 
    public ComplexModel() 
    { 
     Simple = new SimpleModel(); 
    } 

    public SimpleModel Simple{ get; set; } 
} 

Mam zdefiniowane widoki dla tego modelu :

_SimplePartial.cshtml:

@model SimpleModel 

@Html.LabelFor(model => model.Status) 
@Html.EditorFor(model => model.Status) 

i Complex.cshtml:

@model ComplexModel 

@using (Html.BeginForm()) { 

    @Html.Partial("_SimplePartial", Model.Simple) 
    <input type="submit" value="Save" /> 
} 

Po przesłaniu formularza z losową wartością wprowadzoną w polu Status, wartość nie jest powiązana z moim modelem. Pole Status jest NULL kiedy jestem sprawdzanie modelu w mojej działania kontrolera:

[HttpPost] 
public ActionResult Complex(ComplexModel model) 
{ 
    // model.Simple.Status is NULL, why ? 
} 

Dlaczego nie zbindowanych? Nie chcę dziedziczyć modeli. Czy muszę pisać własne niestandardowe segregatory do takich prostych przypadków?

Pozdrawiam.

+0

można to zrobić, ale może oddającego Simple Object do czegoś tak wszystkie pola aren nie można edytować? – icecreamsoop

Odpowiedz

59

Zamiast:

@Html.Partial("_SimplePartial", Model.Simple) 

Polecam Ci pomocą szablonów edytora:

@model ComplexModel 
@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(x => x.Simple) 
    <input type="submit" value="Save" /> 
} 

a następnie umieścić prosty częściowy wewnątrz ~/Views/Shared/EditorTemplates/SimpleModel.cshtml lub wewnątrz ~/Views/Home/EditorTemplates/SimpleModel.cshtml gdzie Home to nazwa kontrolera:

@model SimpleModel 
@Html.LabelFor(model => model.Status) 
@Html.EditorFor(model => model.Status) 

Oczywiście jeśli wolisz mieć częściowy w jakimś szczególnym miejscu i nie są zgodne z konwencjami (dlaczego prawda?) Można określić lokalizację:

@Html.EditorFor(x => x.Simple, "~/Views/SomeUnexpectedLocation/_SimplePartial.cshtml") 

wtedy wszystko przyjdzie na miejsce, jak oczekiwano.

+1

+1 za dobrą odpowiedź. – Chev

+1

Wydaje się ok, ale jest jedna wada. Atrybut id pola Status zmienił się z "Status" na "Simple_Status". Z tego powodu mój javascript przestaje działać. Czy jest jakiś sposób, aby powiedzieć MVC, aby nie zmieniał domyślnych identyfikatorów elementów? Ponieważ nie będę uwzględniać wielu widoków przy użyciu tego samego modelu, identyfikatory będą zawsze unikalne. Mimo to, mabye poprawniej jest po prostu naprawić js? – jwaliszko

+1

Odpowiedź jest pomocna. ale @ Html.EditorFor (x => x.Simple) wyświetli wszystkie właściwości klasy SimpleModel. Ale jeśli chcę wyświetlić tylko kilka właściwości, jak mogę to osiągnąć? –

21

As Daniel Hall suggests in his blog, zdać ViewDataDictionary z TemplateInfo gdzie HtmlFieldPrefix jest ustawiony na imię SimpleModel-PROPERTY:

@Html.Partial("_SimplePartial", Model.Simple, new ViewDataDictionary(ViewData) 
    { 
     TemplateInfo = new System.Web.Mvc.TemplateInfo 
     { 
      HtmlFieldPrefix = "Simple" 
     } 
    }) 
+1

static ViewDataDictionary WithFieldPrefix (to ViewDataDictionary ViewData, łańcuch fieldPrefix) { powrotu nowy ViewDataDictionary (ViewData) { TemplateInfo = nowy TemplateInfo { HtmlFieldPrefix = fieldPrefix } }; } –

+1

Na tę odpowiedź powinno być więcej głosów! –

+1

Podoba mi się ta odpowiedź. ponieważ przez większość czasu potrzebuję używać Partial w złożonych modelach. – kartal

Powiązane problemy