2011-04-14 9 views
19

Bazı seçenekler (ödeme yöntemi nakit, kredi kartı gibi) almak ve bunları radyo düğmelerine bağlamak istiyorum. MVC 3'te hiçbir RadioButtonList olmadığına inanıyorum.Strongly Typed RadioButtonlist

Ayrıca, radyolar bağlandığında, cevabı düzenlerken kullanıcıya önceden seçilmiş olan seçeneği göstermek istiyorum.

public enum PaiementMethod 
{ 
    Cash, 
    CreditCard, 
} 

public class MyViewModel 
{ 
    public PaiementMethod PaiementMethod { get; set; } 
} 

sonra bir denetleyici:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 
} 

ve nihayet bir görünümü:

+0

http://jonlanceley.blogspot.com/2011/06/mvc3-radiobuttonlist-helper.html – Jon

cevap

37

Her zaman olduğu gibi bir model ile başlamak

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    <label for="paiement_cash">Cash</label> 
    @Html.RadioButtonFor(x => x.PaiementMethod, "Cash", new { id = "paiement_cash" }) 

    <label for="paiement_cc">Credit card</label> 
    @Html.RadioButtonFor(x => x.PaiementMethod, "CreditCard", new { id = "paiement_cc" }) 

    <input type="submit" value="OK" /> 
} 

Ve bazı daha genel bir çözüm istiyorsanız Bunu bir yardımcıda kapsülleyen, following answer yararlı bulabilirsiniz.

+3

İyi teşekkürler Darin.Ama benim şartım radyo düğmelerini veritabanı değerlerinden bağlamak ve atanabilmesi için Metin/Değer çiftini radyo düğmesine atama Modelin mülküne. – Vivek

+0

Çok güzel iş! – Funky

+0

Mükemmel! bir süre için bu aradı – bcahill

0

Sen ViewModel SelectList için seçeneklerinizi bağlamak gerekir ve ben RadioButtonLists bağlamak ister böyle mi önceden belirlenen seçeneğe

4

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

İlgili konular