2013-05-15 9 views
5

Utworzono częściowy widok (mimo że szablon edytora), przekazuję podrzędny model do widoku, jednak po kliknięciu "wyślij", zawsze otrzymuję "zerowy" od częściowego widok. Mogę uzyskać wartości właściwości modelu głównego oprócz modelu podrzędnego.Model powrotu z częściowego widoku problemu

Główny model

public class PetModel 
{ 
    public string name {get; set;} 
    public long SpeciesID {get; set;} 
    public long BreedID {get; set;} 
    public Calendar DOB {get; set;} 
} 

Sub model

public class Calendar 
{ 
    public string Year{get; set;} 
    public string Month{get; set;} 
    public string Day{get; set;} 
} 

Widok główny

@model Application.Models.PetModel 
    @using (Html.BeginForm("CatchPetContent", "Quote",Model)) 
    { 
    @Html.TextBoxFor(x => x.Name) 
    @Html.DropDownListFor(x=>x.SpeciesID,new List<SelectListItem>(),"select") 
    @Html.DropDownListFor(x=>x.BreedID,new List<SelectListItem>(),"select") 
    @Html.EditorFor(Model => x.DOB) 
    <input type="submit" value="submit" /> 
    } 

Edytor szablonu

@model Application.Models.Calendar 
@Html.DropDownListFor(Model => Model.Day, new List<SelectListItem>()) 
@Html.DropDownListFor(Model => Model.Month,new List<SelectListItem>()) 
@Html.DropDownListFor(Model => Model.Year, new List<SelectListItem>()) 

"CatchPetContent" działanie

[HttpPost] 
public ActionResult CatchPetContent(PetModel Model) 
{ 


     PetModel pet = new PetModel(); 
     pet.Name = Model.Name; 
     pet.SpeciesID = Model.SpeciesID; 
     pet.BreedID = Model.BreedID; 
     pet.DOB = Model.DOB;// always null 

     RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary(); 
     redirectTargetDictionary.Add("Controller", "Home"); 
     redirectTargetDictionary.Add("Action", "Index"); 

     return new RedirectToRouteResult(new RouteValueDictionary(redirectTargetDictionary)); 

} 

Kiedy debugowany go "Model.DOB" jest zawsze zerowa

Odpowiedz

5

Należy dodać sub-PROPERTY jako dodatkowy parametr w działaniu:

[HttpPost] 
public ActionResult CatchPetContent(PetModel Model, Calendar Bob) 
{  
    ** snip ** 
} 

Domyślny ModelBinder nie zagnieżdża obiektów. Znajduje jednak wartości, jeśli umieścisz je jako drugi parametr.

Jeśli chcesz je zagnieździć, musisz utworzyć własny model.

Poniższe pytanie miał podobny problem: List count empty when passing from view to model in ASP.Net MVC

0

Domyślna modelu spoiwo zwiąże obiektów zagnieżdżonych, nie trzeba tworzyć własne spoiwo modelu dla tego scenariusza.

Patrz: http://lostechies.com/jimmybogard/2011/09/07/building-forms-for-deep-view-model-graphs-in-asp-net-mvc/ i na SO DefaultModelBinder not binding nested model

Podejrzewam problem jest to, że szablon redaktor nie zwraca niczego poprzez stanowisko z powrotem tak zagnieżdżony obiekt jest null. Linie w szablonie Redaktor:

@Html.DropDownListFor(Model => Model.Day, new List<SelectListItem>()) 
@Html.DropDownListFor(Model => Model.Month,new List<SelectListItem>()) 
@Html.DropDownListFor(Model => Model.Year, new List<SelectListItem>()) 

da ci trzy kontrole z pustymi upadków spadek, nie będzie w stanie wybrać coś z tych upadków spadek jak nie dostarczyły żadnych wartości do nich. Jeśli nie ma wartości, nie są one przesyłane przez przewód i nie mogą być powiązane z modelem. Aby rozpocząć zmianę szablonu edytora, należy:

@Html.TextBoxFor(Model => Model.Day) 
@Html.TextBoxFor(Model => Model.Month) 
@Html.TextBoxFor(Model => Model.Year) 

Pozwoli to faktycznie wprowadzić niektóre dane do formularza. Gdy to działa, możesz zmienić pola tekstowe z powrotem na listy rozwijane, ale będziesz musiał podać wartości dla list wyboru, ponownie, po prostu tworzenie nowych pustych list nie pozwoli Ci wybrać żadnych wartości.

+0

masz rację, ale dodałem początkową metodę do każdego rozwijanego menu, ale wciąż mam wartość zerową. Zanim kliknę "Wyślij", wybrałem wartości z rozwijanego menu, jednak po kliknięciu przycisku "Wyślij" model gniazda "Kalendarz" zostałby przypisany jako "null". Mam debugowane metody "SetProperty" w DefaultBuilder, wartość obiektu jest zawsze zerowa – user2376512

+0

Spróbuj sprawdzić wartości przedmiotów z Fiddler, aby zobaczyć, że wartości formularza są rzeczywiście przekazywane z powrotem do serwera. Również jak wygląda kod HTML na rok, aby być powiązanym z modelem, powinien mieć nazwę taką jak DOB. Rok, jeśli nie, to nie będzie związany. –

+0

od Fiddlera Mogę znaleźć ciąg poniżej name = test & SpeciesID = 2 & BreedID = 7 & DOB.Day = 23 & DOB.Month = 05 & DOB.Year = 2010 – user2376512

0

zamiast

@Html.EditorFor(Model => x.DOB) 

spróbować uczynić częściowy widok

@Html.Partial("partialViewName", Model.DOB) 
+0

Próbowałem już, wciąż ma ten sam problem. – user2376512

0

myślę w głównym widoku masz literówka, wygląda na to, należy zmienić

@Html.EditorFor(Model => x.DOB) 

do

@Html.EditorFor(x => x.DOB) 
Powiązane problemy