2011-12-02 7 views
5

मैं निम्नलिखित मॉडल है:RadioButtonFor संपादक टेम्पलेट्स में का चयन नहीं मूल्य

public class Person 
{ 
    public string Name { get; set; } 
    public string Gender { get; set; } 
} 

मैं डिफ़ॉल्ट लिंग महिला होना चाहते हैं, तो मुझे लगता है कि कार्रवाई में स्थापित:

public ActionResult Create() 
{ 
    var model = new Person { Gender = "F" }; // default is female 
    return View(model); 
} 

अंत में, दृश्य इस तरह सबकुछ प्रस्तुत करता है:

@model Person 

@using (Html.BeginForm()) 
{ 
    @Html.EditorForModel() 
    <p><input type="submit" value="Create" /></p> 
} 

यह सब अपेक्षित काम करता है। अब, मान लीजिए कि एक साधारण टेक्स्टबॉक्स के बजाय, मैं लिंग को रेडियो बटन की अधिक सहज ज्ञान युक्त जोड़ी के रूप में प्रदर्शित करना चाहता हूं। तो मैं निम्नलिखित टेम्पलेट बनाने के लिए और साझा/EditorTemplates/Gender.cshtml पर सहेजें:

@model string 
@Html.RadioButtonFor(model => model, "F") Female 
@Html.RadioButtonFor(model => model, "M") Male 

अंत में मैं [UIHint("Gender")] साथ लिंग को सजाने।

लिंग अब ठीक से रेडियो बटन, जो बहुत अच्छा है के साथ प्रदान की गई है, लेकिन ...

समस्या

महिला नहीं रह गया है डिफ़ॉल्ट मान के रूप में चयनित पूर्व आता है और इसके बजाय मैं अंत दो रेडियो बटन खाली। क्या मैं कुछ भूल रहा हूँ?

दिलचस्प बात यह है कि, यदि मैं टेम्पलेट से RadioButtonFor को देखने के लिए स्थानांतरित करता हूं (model => model से model => model.Gender बदल रहा है), तो सब कुछ अपेक्षित काम करता है। मुझे पता है कि यह एक व्यावहारिक कामकाज है, लेकिन ये टेम्पलेटेड हेल्पर्स इतनी अद्भुत, नशे की लत सुविधा है कि मैं उन्हें जाने से पहले सभी संभावनाओं को समाप्त कर दूंगा।

उत्तर

9

मैं जानता हूँ कि यह बदसूरत है, लेकिन निम्न काम कर सकते हैं:

@model string 
@Html.RadioButton("", "F", Model == "F") Female 
@Html.RadioButton("", "M", Model == "M") Male 

RadioButton सहायक के साथ समस्या यह है कि अगर पहले तर्क रिक्त है या खाली यह हमेशा यह विचार करेंगे गैर के रूप में इस प्रकार की जाँच की इस सहायक अनुचित बना रही है संपादक टेम्पलेट्स के लिए।

यहाँ MVC स्रोत कोड से एक अंश है जो दिखाता है मैं क्या मतलब है:

bool isChecked = !string.IsNullOrEmpty(name) && string.Equals(htmlHelper.EvalString(name), b, StringComparison.OrdinalIgnoreCase); 

एक विकल्प के रूप में आप एक custom HTML helper का उपयोग रेडियो बटन की एक सूची उत्पन्न करने के लिए कर सकता है।

+0

+1 और उत्तर। एक इलाज किया! यह बदसूरत नहीं है। अगर कुछ भी है, तो मैं अपने "@ एचटीएमएल.एडिटरफोर मॉडल्स() के धन्यवाद रखने के लिए" कुरूपता "के साथ रहूंगा!:) –

+0

मैं मानता हूं कि यह बदसूरत नहीं है, और एक आकर्षण काम किया। – danludwig

+0

मैंने इस विचार को लिया और उस पर विस्तार किया। मैं अपने संपादक टेम्पलेट में एक सूची <शब्दकोश <स्ट्रिंग, स्ट्रिंग >> पास करता हूं, जिसे मैंने जोड़ा गया व्यूडेटा है जिसे मैं रेडियो बटन बनाने के लिए उपयोग करता हूं। मेरा टेम्प्लेट इस तरह दिखता है – davidbitton

0

मैंने इस विचार को लिया और उस पर विस्तार किया। मैं अपने संपादक टेम्पलेट में List<Dictionary<string,string>> पास करता हूं क्योंकि ViewData जोड़ा गया है जिसका उपयोग मैं रेडियो बटन बनाने के लिए करता हूं। मेरे टेम्पलेट इस

@model string 
@{ 
    var buttons = (List<Dictionary<string, string>>)ViewData["Buttons"]; 
} 
@foreach (var button in buttons) { 
    <label class="radio inline"> 
     @Html.RadioButton(Html.NameForModel().ToHtmlString(), Model, Model == button["Value"], new { id = Html.IdForModel() }) @button["Label"] 
    </label> 
} 

तरह लग रहा है यह है कि क्या मैं करने के लिए गुजर रहा हूँ है मेरी EditorFor के रूप में अतिरिक्त ViewData

new { Buttons = new List<Dictionary<string, string>> { new Dictionary<string, string> { { "Label", "Commercial" }, { "Value", "Y" } }, new Dictionary<string, string> { { "Label", "Residential" }, { "Value", "N" } } } } 

मैं अपने नियंत्रक से देखें एक ViewModel प्रकार में जोड़ना और गुजर सकता है कि दी हालांकि, cshtml फ़ाइल में ऐसा करना जल्दबाजी में था।

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