için true özelliğini Seçilmiş ayarlayın. Görünüm modelinde, güçlü yazılan nesnelerimden oluşan bir koleksiyon var. Örneğin, belki PaymentOptions bir kod tablosudur. Koleksiyon ile birlikte bir SelectedPaymentOptionKey (veya birincil anahtarlarınızı Id ile öneki eklerseniz). Başlangıçta bu anahtar sadece varsayılan 0 olacaktır, ancak geri gönderme sırasında seçilen öğenin değerini tutacaktır. Ardından View
public class PaymentSelectionVM
{
public ICollection<PaymentOption> PaymentOptions { get; set; }
public int SelectedPaymentOptionKey { get; set; }
}
public ViewResult PaymentSelection()
{
var paymentOptions = db.PaymentOptions.ToList();
return View(
new PaymentSelectionVM {
PaymentOptions = paymentOptions,
//This is not required, but shows how to default the selected radiobutton
//Perhaps you have a relationship between a Customer and PaymentOption already,
//SelectedPaymentOptionKey = someCustomer.LastPaymentOptionUsed.PaymentOptionKey
// or maybe just grab the first one(note this would NullReferenceException on empty collection)
//SelectedPaymentOptionKey = paymentOptions.FirstOrDefault().PaymentOptionKey
});
}
:
@foreach (var opt in Model.PaymentOptions)
{
@*Any other HTML here that you want for displaying labels or styling*@
@Html.RadioButtonFor(m => m.SelectedPaymentOptionKey, opt.PaymentOptionKey)
}
m.SelectedPaymentOptionKey iki amaca hizmet eder. Birincisi, radyo düğmelerini bir araya getirerek seçimin birbirini dışlaması için gruplandırır (FireBug gibi bir şeyi, sadece kendi anlayışınız için oluşturulan html'yi denetlemek için kullanmanızı öneririm) MVC hakkındaki harika şey, oluşturulan HTML'nin oldukça basit ve standart olmasıdır. Bu yüzden sizin görüşlerinizin davranışlarını tahmin edebilmeniz çok zor olmamalıdır. Burada çok az büyü var.). İkincisi, seçilen öğenin değerini geri gönderme üzerinde tutacaktır.
Ve nihayet sonrası işleyicisi biz mevcut SelectedPaymentOptionKey var:
[HttpPost]
public ActionResult PaymentSelection(PaymentSelectionVM vm)
{
currentOrder.PaymentOption = db.PaymentOptions.Find(vm.SelectedPaymentOptionKey);
....
}
SelectListItems kullanarak üzerinden bu avantajı size bir tablo gösterdiğinizi durumda nesne özelliklerinin daha erişebilir olduğu/Tablo ve nesnenin birçok değerini görüntülemek gerekiyor. Ayrıca, diğer bazı yaklaşımların da olduğu gibi Html yardımcılarında hiç kodlanmış dizeler bulunmadığından hoşlanıyorum.
Dezavantaj, aynı ID'ye sahip olan ve gerçekten iyi bir uygulama olmayan radyo düğmeleri elde etmenizi sağlar. Bu kolayca Buna değiştirerek sabittir:
@Html.RadioButtonFor(m => m.SelectedPaymentOptionKey, opt.PaymentOptionKey, new { id = "PaymentOptions_" + opt.PaymentOptionKey})
Son olarak, doğrulama gördüğüm radyo düğmesi tekniklerinin çoğu tüm biraz tuhaf. Gerçekten buna ihtiyacım varsa, radyo düğmelerinin tıklandığı her seferinde gizli bir SelectedPaymentOptionsKey yerleştirmek için bazı jquery'leri bağlardım ve gizli alana [Required]
veya başka bir doğrulama yerleştiririm.
doğrulama sorunu için başka bir geçici çözüm ASP.NET MVC 3 unobtrusive validation and radio buttons
Bu umut verici görünüyor ama bunu test etmek için bir fırsatım olmadı: yardımcı olabilir blogumda bir html yardımcı yoktur http://memoriesdotnet.blogspot.com/2011/11/mvc-3-radiobuttonlist-including.html
http://jonlanceley.blogspot.com/2011/06/mvc3-radiobuttonlist-helper.html – Jon