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ındaModeli
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?
+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. –
@SeanHolmesby Düzenleme için teşekkürler :) – mattytommo
@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. –