2011-04-14 18 views
19

मैं कुछ विकल्प प्राप्त करना चाहता हूं (भुगतान विधि नकदी, क्रेडिट कार्ड इत्यादि कहें) और इन्हें रेडियो बटन से बांधें। मेरा मानना ​​है कि एमवीसी 3 में कोई रेडियोबटन सूची नहीं है।मजबूत टाइप किए गए रेडियोबटन सूची

इसके अलावा, एक बार रेडियो बाध्य होने के बाद मैं उत्तर संपादित करते समय उपयोगकर्ता को पहले चयनित विकल्प दिखाना चाहता हूं। एक नियंत्रक

public enum PaiementMethod 
{ 
    Cash, 
    CreditCard, 
} 

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

तो:

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

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

और अंत में एक दृश्य:

+0

अपने ब्लॉग पर एक एचटीएमएल सहायक मदद मिल सकती है नहीं है http://jonlanceley.blogspot.com/2011/06/mvc3-radiobuttonlist-helper.html – Jon

उत्तर

37

हमेशा की तरह आप एक मॉडल के साथ शुरू

@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" /> 
} 

और आप कुछ और अधिक सामान्य समाधान चाहते हैं जो एक सहायक में इसे समाहित करता है, आपको following answer सहायक मिल सकता है।

+3

खैर धन्यवाद डारिन.लेकिन मेरी आवश्यकता है कि रेडियो बटन को डेटाबेस मानों से बांधें और टेक्स्ट/वैल्यू जोड़ी को रेडियो बटन पर असाइन करें ताकि इसे असाइन किया जा सके मॉडल की संपत्ति के लिए। – Vivek

+0

बहुत अच्छा काम! – Funky

+0

सही! थोड़ी देर के लिए यह देख रहा था अब – bcahill

0

आप ViewModel में को selectList अपने विकल्पों के लिए बाध्य करना चाहिए और पहले से चयनित विकल्प

4

के लिए सच करने के लिए विशेषता चयनित सेट यह वह जगह है मैं कैसे RadioButtonLists बाध्य करने के लिए पसंद करते हैं। दृश्य मॉडल में मेरी दृढ़ता से टाइप की गई वस्तुओं का संग्रह है। उदाहरण के लिए, हो सकता है कि भुगतान विकल्प एक कोड तालिका है। संग्रह के साथ एक चयनित भुगतान हैप्शनकी (या चयनित * आईडी यदि आप आईडी के साथ अपनी प्राथमिक कुंजी को उपसर्ग करते हैं)। प्रारंभ में यह कुंजी केवल डिफ़ॉल्ट 0 होगी, लेकिन पोस्टबैक पर, यह चयनित आइटम का मान रखेगी।

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 दो उद्देश्यों में कार्य करता है। सबसे पहले, यह रेडियो बटन को एक साथ जोड़ता है ताकि चयन पारस्परिक रूप से अनन्य हो (मैं आपको अपनी समझ के लिए जेनरेट किए गए एचटीएमएल का निरीक्षण करने के लिए फायरबग जैसे कुछ उपयोग करने के लिए प्रोत्साहित करता हूं। एमवीसी के बारे में अद्भुत बात जेनरेट की गई HTML काफी बुनियादी और मानक है इसलिए अंततः आपके विचारों के व्यवहार की भविष्यवाणी करने में सक्षम होना मुश्किल नहीं होना चाहिए। यहां बहुत कम जादू चल रहा है।)। दूसरा, यह चयनित आइटम का मूल्य पोस्टबैक पर रखेगा।

और अंत में पद हैंडलर में हम SelectedPaymentOptionKey उपलब्ध:

[HttpPost] 
public ActionResult PaymentSelection(PaymentSelectionVM vm) 
{ 
    currentOrder.PaymentOption = db.PaymentOptions.Find(vm.SelectedPaymentOptionKey); 
    .... 
} 

SelectListItems का उपयोग करने पर इसका लाभ आपको लगता है कि आप एक ग्रिड प्रदर्शित कर रहे हैं मामले में ऑब्जेक्ट के गुणों के और अधिक के लिए उपयोग किया है/तालिका और वस्तु के कई मूल्य प्रदर्शित करने की आवश्यकता है। मुझे यह भी पसंद है कि कुछ अन्य दृष्टिकोणों के रूप में एचटीएमएल हेल्पर्स में कोई कठोर कोडित स्ट्रिंग नहीं हो रही है।

नुकसान आपको रेडियो बटन मिलते हैं जिनके पास एक ही आईडी है, जो वास्तव में एक अच्छा अभ्यास नहीं है। यह आसानी से इस को बदलकर तय हो गई है:

@Html.RadioButtonFor(m => m.SelectedPaymentOptionKey, opt.PaymentOptionKey, new { id = "PaymentOptions_" + opt.PaymentOptionKey}) 

अन्त में, मान्यता रेडियो बटन तकनीक मैंने देखा है के सबसे सभी के साथ एक सा विचित्र है। अगर मुझे वास्तव में इसकी ज़रूरत है, तो जब भी रेडियो बटन क्लिक किए जाते हैं, तो मैं एक छिपी हुई चयनित भुगतान विकल्प को पॉप्युलेट करने के लिए कुछ jquery तार दूंगा, और छिपे हुए क्षेत्र पर [Required] या अन्य सत्यापन रखें।

सत्यापन समस्या के लिए एक और वैकल्पिक हल ASP.NET MVC 3 unobtrusive validation and radio buttons

इस होनहार लग रहा है लेकिन मैं इसे परीक्षण करने के लिए एक मौका नहीं मिला है: http://memoriesdotnet.blogspot.com/2011/11/mvc-3-radiobuttonlist-including.html

संबंधित मुद्दे