2013-05-25 8 views
12

eingestellt Ich habe ein Problem mit meiner App, erkläre versuchen, mit einem Beispiel zu erklären, ich habe ein Formular, dieses Formular existieren mehrere Textfelder und Dropdown-Listen. Für die Wiederverwendbarkeit habe ich 3 Dropdown-Listen in eine Teilansicht zusammengeführt, diese Teilansicht lade ich mit @ Html.Action, das funktioniert ok, wenn ich das Formular starte sehe ich alles erscheint so wie es sein sollte, obwohl ich nicht weiß warum aber diese benötigt Drop-Down-Listen direkt mit rot Start und sagte, es ist Pflichtfelder.MVC 3 Model Eigenschaft wird nicht in Teilansicht von html.action

Aber wenn ich alles fülle, und ich wähle die Werte aus den Dropdown-Listen, und ich klicke auf OK, die Werte von Dropdown-Listen sind NULL.

ich denke, es mit einem Code Beispiel mehr comprehendable sein wird:

Hauptmodell:

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

Hier ist die Lage Klasse, die dann auf die Teilansicht übergeben wird und in der Regel denke ich sein soll Set, sieht es wie folgt aus:

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

Jetzt haben wir eine Teilansicht für den Standort:

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

Dann nennen wir diese Teilansicht in den Formen wie folgt aus:

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

Und schließlich in der Steuerung:

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

Ich weiß, dass es eine Menge Code, aber ich hoffe, dass Sie helfen könnte mir ...

+0

** Aber wenn ich alles einfüge, und ich wähle die Werte aus den Dropdown-Listen, und ich klicke auf OK, die Werte aus Dropdown-Listen sind NULL. ** Haben Sie versucht, die Formulare mit 'JQuery/JSON' zu senden oder haben Sie versucht, den Formularinhalt durch Einschließen von' Ajax.Begin' festzulegen? – wwcdwdcw

+0

Könnten Sie die Namen der Eigenschaften überprüfen, die an den Server gesendet werden (zum Beispiel über Firebug)? Ich wette, dass die Namen, die Ihrer Teilansicht entsprechen, nicht zum Modell in der Namensform passen. Also mvc kann nicht zur verbindung. – Vic

Antwort

3

Ich glaube, Sie Editor Vorlagen verwenden sollen:

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

und fügen Sie den Teil innerhalb ~/Views/[ControllerName]/EditorTemplates/Location.cshtml oder ~/Views/Shared/EditorTemplates/Location.cshtml

Code der Vorlage:

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

Aber wenn Sie es vorziehen, in irgendeiner Lage teilweise zu haben (Konventionen nicht folgen) Sie könnten den Ort angeben:

0

Versuchen Html.RenderPartial statt Html.Action

+0

Ja, es würde besser funktionieren, denke ich, aber ich würde lieber die Aktion verwenden, ich lese, dass dieser Weg besser ist, da ich diese ddls aus der Datenbank befüllen muss, ich werde es nicht zweimal machen müssen ... – Alnedru

1

Ich stimme Xordal zu, EditorTemplates sind der Weg zu gehen. Unglaublich nützliches Zeug. Eine Sache bemerkte ich das Fehlen einer SelectList. Ich vermisse hier vielleicht etwas, aber hast du folgendes versucht ?:

+1

Ja, Sie haben Recht. Ich weiß darüber :) http://stackoverflow.com/a/12667845/1643075 Aber ist nicht das Problem der Frage – Xordal