के लिए सच करने के लिए विशेषता चयनित सेट यह वह जगह है मैं कैसे 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
अपने ब्लॉग पर एक एचटीएमएल सहायक मदद मिल सकती है नहीं है http://jonlanceley.blogspot.com/2011/06/mvc3-radiobuttonlist-helper.html – Jon