2013-05-25 33 views
12

Mam problem z moją aplikacją, źle próbuję wyjaśnić za pomocą przykładu, mam formularz, ta forma istnieje z kilkoma polami tekstowymi i listami rozwijanymi. Do ponownego użycia scaliłem 3 rozwijane listy w częściowy widok, ten częściowy widok ładowałem z @ Html.Action, to działa dobrze, kiedy zaczynam formularz widzę wszystko tak, jak powinno być, chociaż nie wiem dlaczego, ale wymagane rozwijane listy są wyświetlane z czerwonym początkiem i mówi, że są wymagane pola.Właściwość modelu MVC 3 nie jest ustawiona w widoku częściowym wywołanym przez html.action

Ale kiedy wszystko wypełnia, a ja wybieram wartości z rozwijanych list, i klikam OK, wartości z rozwijanych list są NULL.

myślę będzie bardziej comprehendable z przykładu kodu:

główna modelu:

public class FormModel 
{ 
    [Required] 
    public string UserName { get; set; } 

    [Required] 
    [Display(Name = "Birthdate")] 
    public DateTime? Birthdate { get; set; } 
    //This is what i'm talking about, that is not being set, the location 
    public Location Location { get; set; } 
} 

Oto klasa lokalizacja, który jest następnie przekazywany do częściowym widokiem i normalnie myślę, że powinno być zestaw, wygląda to tak:

public class Location 
{ 
    [Required] 
    [Display(Name = "Country")] 
    public string CountryId { get; set; } 

    [Required] 
    [Display(Name = "Region")] 
    public string RegionId { get; set; } 

    [Required] 
    [Display(Name = "City")] 
    public string CityId { get; set; } 
    } 

teraz mamy częściowy widok na miejscu:

@model TestWebsite.Models.Location 
<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.CountryId) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.CountryId, Model.Countries, "---select--", null) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.CountryId) 
    </td> 
</tr> 
<!-- Region --> 
<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.RegionId) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.RegionId, Enumerable.Empty<SelectListItem>(), "---select--", null) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.RegionId) 
    </td> 
</tr> 
<!-- City --> 
<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.CityId) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.CityId, Enumerable.Empty<SelectListItem>(), "---select--", null) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.CityId) 
    </td> 
</tr> 

Wtedy nazywamy to częściowy widok w formach tak:

@Html.Action("LocationGroup", "Account", Model.Location) 

i wreszcie w kontrolerze:

[ChildActionOnly] 
    public ActionResult LocationGroup(Location model) 
    { 
     model.Countries = GetCountries(); 
     return PartialView("_LocationView", model); 
    } 

wiem, że jest dużo kodu, ale mam nadzieję, że może mi pomóc ...

+0

** Ale kiedy wypełnić wszystko, a ja wybrać wartości z rozwijanej listy i kliknięciu OK, wartości z rozwijane listy mają wartość NULL. ** Czy próbowałeś przesłać formularze za pomocą 'JQuery/JSON' lub próbowałeś ustawić zawartość formularza przez zawijanie' Ajax.Begin'? – wwcdwdcw

+0

Czy możesz sprawdzić nazwy właściwości, które są wysyłane do serwera (na przykład przez Firebug) Założę się, że nazwy odpowiadające częściowemu widokowi nie pasują do modelu w formie nazwy. Więc mvc nie może do wiązania. – Vic

Odpowiedz

3

Myślę, że należy użyć Edytora szablonów:

@model TestWebsite.Models.FormModel 
@using(Html.BeginForm()) 
{ 
    @Html.EditorFor(x => x.Location) 
    <input type="submit" value="save"/> 
} 

i dodać częściowe wewnątrz ~/Views/[ControllerName]/EditorTemplates/Location.cshtml lub ~/Views/Shared/EditorTemplates/Location.cshtml

kodu szablonu:

@model TestWebsite.Models.Location 
<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.CountryId) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.CountryId, Model.Countries, "---select--", null) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.CountryId) 
    </td> 
</tr> 
<!-- Region --> 
<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.RegionId) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.RegionId, Enumerable.Empty<SelectListItem>(), "---select--", null) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.RegionId) 
    </td> 
</tr> 
<!-- City --> 
<tr> 
    <td class="editor-label"> 
     @Html.LabelFor(m => m.CityId) 
    </td> 
    <td class="editor-field"> 
     @Html.DropDownListFor(m => m.CityId, Enumerable.Empty<SelectListItem>(), "---select--", null) 
    </td> 
    <td> 
     @Html.ValidationMessageFor(m => m.CityId) 
    </td> 
</tr> 

Ale jeśli wolisz mieć częściowy w jakimś miejscu (nie stosować się do konwencji) można podać lokalizację:

@Html.EditorFor(x => x.Location, "~/Views/SpecifyLocation/_Location.cshtml") 
0

Spróbuj Html.RenderPartial zamiast Html.Action

+0

Tak, to by działało lepiej, myślę, ale wolałbym używać Action, czytałem, że ten sposób jest lepszy, ponieważ muszę zapełnić te ddls z bazy danych, nie będę musiał robić tego dwa razy ... – Alnedru

1

Zgadzam się z Xordal, EditorTemplates są drogą do zrobienia. Niewiarygodnie przydatne rzeczy. Jedna rzecz zauważyłem brak SelectList. I może być brakuje czegoś tutaj, ale czy próbowałeś następujące ?:

<td class="editor-label"> 
    @Html.LabelFor(m => m.CountryId) 
</td> 
<td class="editor-field"> 
    @Html.DropDownListFor(m => m.CountryId, new SelectList(Model.Countries, "CountryId" , "CountryName", null)) 
</td> 
<td> 
    @Html.ValidationMessageFor(m => m.CountryId) 
</td> 
+1

Tak, masz rację. Wiem o tym :) http://stackoverflow.com/a/12667845/1643075 Ale nie jest problem z pytaniem – Xordal