2013-03-20 26 views
5

Bakış bir özelliktir: Ben düzenlemek için çalışıyorum modeli sınıftır bir özelliği olan bir ViewModel kullanmaya çalışıyorum . Doğrudan bir model düzenlerken MVC iskele düzenleme formlarını kullanarak düzenleme formu işini gördüm, ancak düzenlenmiş modeli içeren bir ViewModel kullanmaya çalışıyorum. Her şey bir DropDownList'te görüntülenen bir alanın tasarrufu dışında çalışır.MVC 3: bir nesne için bir Düzenle Formu'nda DropDownList bir ViewModel

Açıklama: Bir model için bir düzenleme form oluşturmak için MVC 3'ün iskele özelliklerini kullanmak çalıştınız. MVC Müzik Mağazası eğitiminde, bu, sayfasının StoreManagerController'daki Düzen sayfası için yapılır. Bu sayfada, Genre ve Artist için iki düşüş var. Her görünümde şuna benzer: - söyleyebilirim

<div class="editor-label"> 
    @Html.LabelFor(model => model.GenreId, "Genre") 
</div> 
<div class="editor-field"> 
    @Html.DropDownList("GenreId", String.Empty) 
    @Html.ValidationMessageFor(model => model.GenreId) 
</div> 

Bildiğim kadarıyla, bu onların seçenekler ViewBag kullanarak kontrolörü olarak doldurulması gerekir.

ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId); 
ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId); 

Benim kod Modeli doğrudan

ile çalışarak, ben Entity Framework ile DB kaydedilen devam eden bir nesne ile aynı şeyi başardı. Bu iyi çalışır

<div class="editor-label"> 
    @Html.LabelFor(model => model.ClubId, "Club") 
</div> 
<div class="editor-field"> 
    @Html.DropDownList("ClubId", String.Empty) 
    @Html.ValidationMessageFor(model => model.ClubId) 
</div> 

Kontrolör

yılında

Modeli

public class Season 
{ 
    public int SeasonId { get; set; } 
    public int ClubId { get; set; } 
    public Club Club { get; set; } 
} 

Kod

ViewBag.ClubId = new SelectList(clubs, "ClubId", "Name", season.ClubId); 

Görünüm. Ancak Görünüm Modeli

çalışma

şimdi sayfa ben düzenleme olduğum modelinde mevcut olandan görüntülenen fazla metin ihtiyacı olduğunu anlamışlardır. Düzenlenen model (sezon) ve görüntülemek istediğim ek metin ile özel bir Görünüm Modeli oluşturmayı umuyordum.

ViewModel

public class EditSeasonViewModel 
{ 
    public string PlayerName {get; set;} 
    public string SummaryText {get; set;} 
    public int PlayerId {get; set;} 
    public Season season {get; set;} 
} 

Ben, bu yaptığımız HttpGet ve HttpPost yöntemleri yeni ViewModel kullanmasını sağlamak için denetleyici değişti, yeni ViewModel kabul etmek Görünüm değişti ve tüm 'EditorFor' yöntemleri değişti model.season.MyProperty'yi kullanmak için görüntüleyin. Görünümünde

Kod

ViewBag.ClubId = new SelectList(clubs, "ClubId", "Name", seasonVM.season.ClubId); 

Kanunu Kontrolörü içinde

<div class="editor-label"> 
    @Html.LabelFor(model => model.season.ClubId, "Club") 
</div> 
<div class="editor-field"> 
    @Html.DropDownList("ClubId", String.Empty) 
    @Html.ValidationMessageFor(model => model.season.ClubId) 
</div> 

HttpPost yöntemi ayıklarken, sezonu için tüm değerleri düzgün DropDropList gelmelidir ClubId değeri yasiyor .

Modelde doğrudan kullandığımız zamandan itibaren DropDownList'i hiç Görünümde değiştirmedim.

Soru: Sorum şu, ne bu yeni EditSeasonViewModel kullanırken ClubId düzgün kaydedilmesini almak için değiştirmek gerekiyor?

Ayrıca, denetleyicideki HttpGet yöntemindeki ViewBag.ClubId, Görünüm'deki DropDownList ile eşleşiyor ve daha sonra değeri HttpPost yöntemine geri döndürülüyor mu?

cevap

9

Bu yanlış olan DropDownList beyanıdır. Bunun yerine bu deneyin: Sonra

public SelectList Clubs { get; set; } 

kontrolörünüze bunu doldurmak:

@Html.DropDownListFor(m => m.season.ClubId, ViewBag.ClubId) 

Ama gerçekten, modeliniz bu seçim listesini koymalıyız Sonra

Model.Clubs = new SelectList(clubs, "ClubId", "Name", season.ClubId); 

yapabilirsiniz yapmak:

+2

+1. [Tag: asp.net-mvc] 'daki açılır liste sorularının çoğunluğu, ViewBag, zayıf yazılan yardımcılar ve model bağlama sorunları ile karışmaktan kaynaklanıyor. –

+0

@SeanHolmesby Düzenleme için teşekkürler :) – mattytommo

+0

@mattytommo - Mükemmel. İşe yaradı. İleriye gittim ve kırkça yazılan yardımcınızı kullandım, ki bu da Kırk-İki'nin dediği gibi, Drop Down listelerini ele almak için daha iyi bir yol. Sanırım şu anki sürecini anlıyorum. –

3

Verileri eylem yöntemlerinden görünümlere aktarmak için ViewBag/ViewData gibi dinamik öğeler kullanmaktan kaçının. Güçlü yazılan yaklaşıma geçin.

2 diğer özelliğe sahip olmak için Viewmodel'inizi güncelleyin. Mevcut kulüplerin bir koleksiyonunu tutmak ve seçilen kulüp tutmak için biri. GET eylem Şimdi

public class EditSeasonViewModel 
{ 
    public List<SelectListItem> Clubs { set;get;} 
    public int SelectedClub { set;get;} 

    public string PlayerName {get; set;} 
    public string SummaryText {get; set;} 
    public int PlayerId {get; set;} 
    public Season season {get; set;} 

    public EditSeasonViewModel() 
    { 
     Clubs=new List<SelectListItem>(); 
    } 
} 

, kulüpleri alın ve Clubs Mülke yükleyin. GetListOfSelectListItemFromClubsFromSomeWhere varsayarak

public ActionResult create(int id) 
{ 
    var vm=new EditSeasonViewModel(); 
    vm.Clubs=GetListOfSelectListItemFromClubsFromSomeWhere(); 
    return View(vm); 
} 

, senin Kulüpler

public List<SelectListItem> GetListOfSelectListItemFromClubsFromSomeWhere() 
{ 
    // to do : return List<SelectListItem> with Value and Text(ClubId Id & Name) 
} 

ve görünümde

için SelectListItem listesini döndüren bir yöntemdir bu formu olmanın olduğunda Html.DropDownListFor yardımcı yöntemini

@model EditSeasonViewModel 
@using(Html.Beginform()) 
{ 

    @Html.DropdownlistFor(x=>x.SelectedClub, 
          new SelectList(Model.Clubs,"Value","Text"),"select") 
    <input type="submit" /> 
} 

kullanmak Yayınlanan, seçtiğiniz kulübün kimliğini, yayınlanan modelinizin SelectedClub mülkünde alacaksınız.

0

Düzenlemeniz/creat eylem denetleyicisi, mülkiyet doğru binded emin olun: türü kesin yardımcı kullanarak için

public async Task<ActionResult> Edit([Bind(Include = "SeasonId,ClubId, otherproperties"]){ 
// code ... 
}