2016-09-18 6 views
0

Ich habe eine MVC 5 Seite, ich würde gerne eine stark typisierte DropDownListFor mit einem ViewModel verwenden - nicht mit ViewBag.asp.net mv 5, DropDownListFor mit ViewModel funktioniert nicht

Ich habe verschiedene Artikel zu diesem gefunden - aber sie alle scheinen riesige Löcher zu haben - zum Beispiel dieses deckt nicht Bearbeitung, und ich verstehe nicht, wie oder wann "SelectedFlavourId" sollte verwendet werden. http://odetocode.com/blogs/scott/archive/2013/03/11/dropdownlistfor-with-asp-net-mvc.aspx

Ich habe mehrere Anforderungen.

  • Wenn die Geschichte der Bearbeitung würde ich ein Dropdown-Liste aller Orte gerne angezeigt werden - mit dem zugehörigen Ort (falls vorhanden) - ausgewählt.
  • Ich möchte die stark typisierte DropDownListFOR (im Gegensatz zu DropDownList) verwenden.
  • Ich möchte ein ViewModel nicht den ViewBag verwenden.
  • Ich möchte einen "No Associated Place" hinzufügen, der ausgewählt wird, wenn PlaceId null ist.
  • Ich möchte eine css class = "form-control" zu DropDownListFor hinzufügen.

Das unten ist so weit wie ich nach einem Tag der Frustration habe.

Eine Story kann optional mit einer PlaceId verknüpft werden. Eine leere placeId ist ebenfalls gültig. Ein Ort kann auch mit mehr als einer Geschichte verbunden sein.

Modelle

public class Place 
{ 
    public Guid Id { get; set; } 
    public string PlaceName { get; set; } 
} 

public class Story 
{ 
    public Guid Id { get; set; } 
    public Guid? PlaceId { get; set; } 
    public string StoryName { get; set; } 
} 

public class StoryPlaceDropdown 
{ 
    public Story story { get; set; } 
    public Guid SelectedStoryId; 
    public IEnumerable<Place> places; 
    public IEnumerable<SelectListItem> placeItems 
    { 
     get 
     { 
      return new SelectList(places, "Id", "PlaceName"); 
     } 
    } 
} 

-Controller

public ActionResult Edit(Guid Id) 
{ 
    var spd = new StoryPlaceDropdown(); 

    spd.places = PlaceRepo.SelectAll(); 
    spd.story = StoryRepo.SelectStory(Id); 
    spd.selectedStoryID = apd.story.Id; 

    // Return view 
    return View(spd); 
} 

[HttpPost] 
public ActionResult Edit(StoryPlaceDropdown spd) 
{ 
    // Never gets this far 
    spd.Places = PlaceRepo.SelectAll(); 

    return View(); 
} 

In View

@Html.DropDownListFor(m => m.SelectedStoryId, Model.PlaceItems) 

Dieser füllt die DropDow nListe gut. Es wird jedoch nicht das richtige Element in der Bearbeitungsansicht ausgewählt. Auch wenn ich das Formular absende, erhalte ich diesen Fehler: Objektreferenz nicht auf eine Instanz eines Objekts festgelegt. in dieser Zeile in der Ansicht @ Html.DropDownListFor (m => M.SelectedStoryId, Model.PlaceItems)

Wie kann ich das alles funktioniert? Vielen Dank.

+1

'@Html.DropDownListFor (m => m.SelectedStoryId, Model.PlaceItems, "Kein zugehöriger Ort", new {@class = "form-control"}) 'um die letzten 2 Punktpunkte zu adressieren (die 3. Parameter fügen eine 'null'-Label-Option hinzu) und der vierte fügt den Klassennamen hinzu). Wenn der Wert von 'SelectedStoryId' genau mit einem der 'Place.Id'-Werte übereinstimmt, wird diese Option ausgewählt. –

+1

Wie bei der 'NullReferenceException' müssen Sie den Code in Ihrer POST-Methode anzeigen (ich nehme an, Sie müssen versuchen, auf einen Wert in der Eigenschaft' placeItems' zuzugreifen, der 'null' ist) und die' SelectList' nicht wann wieder aufgefüllt hat Sie geben die Ansicht zurück. –

+1

Zusätzlich enthält das Modell ein Feld für 'SelectedStoryId' - es muss eine Eigenschaft sein -' public Guid SelectedStoryId {get; set;} 'um zu binden –

Antwort

0

Ich löste das - ich hatte dumm vergessen {bekommen; einstellen; } Accessoren auf dem ViewModel, doh!

-1

können Sie beschlossen dies durch diese drei Schritte:

Schritt 1: Erstellen Ansichtsmodell

public class StoryPlaceDropdown 
{ 
    Required] 
    [Display(Name = "SelectedStory")] 
    public int SelectedStoryId { get; set; } 
} 

Schritt 2: Danach auf Controller, den Sie schreiben:

public ActionResult Edit(Guid Id) 
{ 
var spd = new StoryPlaceDropdown(); 
    ViewBag.PlaceItems= PlaceRepo.SelectAll(); 
spd.story = StoryRepo.SelectStory(Id); 
spd.selectedStoryID = apd.story.Id; 
return View(spd); 
} 

Schritt 3: Und auf Sicht können Sie schreiben

<div class="col-sm-6"> 
    @Html.DropDownListFor(m => m.SelectedStoryId, new SelectList(@ViewBag.PlaceItems, "Id", "PlaceName"), "---Select---", new { @class = "form-control select-sm" }) 
      </div> 
Verwandte Themen