2011-10-19 7 views
6

This Question समान है लेकिन स्वीकार्य उत्तर इसे सर्वर पक्ष हल करता है, मुझे क्लाइंट साइड समाधान में दिलचस्पी है।DropDownListFor Unobtrusive प्रमाणीकरण आवश्यक गुणों को प्राप्त नहीं किया

इस ViewModel

public class MyViewModel 
{ 
    public string ID { get; set; } 

    [Required(ErrorMessage = "I DEMAND YOU MAKE A CHOICE!")] 
    [Display(Name = "Some Choice")] 
    public int SomeChoice{ get; set; } 
    [Required(ErrorMessage = "I DEMAND YOU MAKE A CHOICE!")] 
    [Display(Name = "Keyword")] 
    public string Keyword { get; set; }  
} 

और उस्तरा

<div> 
@Html.LabelFor(model => model.SomeChoice, new { @class = "label" }) 
@Html.DropDownListFor(model => model.SomeChoice, (SelectList)ViewBag.SomeChoice, "Select...") 
@Html.ValidationMessageFor(model => model.SomeChoice) 
</div> 

को देखते हुए और मान लेते हैं ViewBag.SomeChoice विकल्पों

के एक चयनित सूची शामिल है प्रदान की गई एचटीएमएल डेटा-वैल नहीं मिलता है = "सत्य" डेटा-वैल-आवश्यक = "मुझे लगता है कि आप एक विकल्प बनाते हैं!" इसमें विशेषताएं @ Html.EditorFor (model => model.Keyword) या @ Html.TextBoxFor प्रस्तुत करेंगे।

क्यों?

एक वर्ग = तो

@Html.DropDownListFor(model => model.SomeChoice, (SelectList)ViewBag.SomeChoice, "Select...", new { @class = "required" }) 

जो प्रस्तुत पर jQuery मान्यकरण वर्ग अर्थ विज्ञान और ब्लॉक का उपयोग करता है, लेकिन संदेश प्रदर्शित नहीं करता है जैसे कि यह करने के लिए "आवश्यक" जोड़ना। मैं

@Html.DropDownListFor(model => model.SomeChoice, (SelectList)ViewBag.SomeChoice, "Select...", new Dictionary<string, object> { { "data-val", "true" }, { "data-val-required", "I DEMAND YOU MAKE A CHOICE!" } }) 

कौन सा सही डाल देंगे वहाँ गुण, और ब्लॉक प्रस्तुत पर और संदेश से पता चलता है लेकिन मेरे ViewModel

पर RequiredAttribute त्रुटिसंदेश का लाभ मेरे पास है नहीं ले करता है बात इस तरह का कर सकते हैं तो क्या किसी ने ड्रॉपडाउनलिस्ट लिखा है जो सत्यापन के संबंध में अन्य एचटीएमएल हेल्पर की तरह व्यवहार करता है?

संपादित यहाँ मेरी सटीक कोड

HomeController.cs

public class MyViewModel 
    { 
    [Required(ErrorMessage = "I DEMAND YOU MAKE A CHOICE!")] 
    [Display(Name = "Some Choice")] 
    public int? SomeChoice { get; set; } 
    } 


    public ActionResult About() 
    { 
     var items = new[] { new SelectListItem { Text = "A", Value = "1" }, new SelectListItem { Text = "B", Value = "2" }, new SelectListItem { Text = "C", Value = "3" }, }; 
     ViewBag.SomeChoice = new SelectList(items,"Value", "Text"); 
     ViewData.Model = new MyViewModel {}; 
     return View(); 
    } 

में

@using Arc.Portal.Web.Host.Controllers 
@model MyViewModel 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) 
{ 
<div> 
    @Html.LabelFor(model => model.SomeChoice) 
    @Html.DropDownListFor(model => model.SomeChoice, (SelectList)ViewBag.SomeChoice, "Select...") 
    @Html.ValidationMessageFor(model => model.SomeChoice) 
</div> 

<button type="submit">OK</button> 
} 

यहाँ है About.cshtml

और गाया कोड

है

यह वापस मेरी नियंत्रक पर भी पोस्ट कर ... ऐसा नहीं करना चाहिए

उत्तर

5

आप संपत्ति आप अपना दृश्य मॉडल पर करने के लिए dropdownlist बाध्यकारी हैं पर एक नल पूर्णांक का उपयोग करें:

[Required(ErrorMessage = "I DEMAND YOU MAKE A CHOICE!")] 
[Display(Name = "Some Choice")] 
public int? SomeChoice { get; set; } 
इसके अलावा

में आदेश उचित विनीत एचटीएमएल 5 पाने के लिए डेटा- * विशेषताएं लटकती एक रूप के अंदर होना चाहिए:

@model MyViewModel 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) 
{ 
    <div> 
     @Html.LabelFor(model => model.SomeChoice, new { @class = "label" }) 
     @Html.DropDownListFor(
      model => model.SomeChoice, 
      Model.ListOfChoices, 
      "Select..." 
     ) 
     @Html.ValidationMessageFor(model => model.SomeChoice) 
    </div> 

    <button type="submit">OK</button> 
} 

इसके अलावा आप देखेंगे कि मैं (ViewBag से छुटकारा मिला जो मैं बस Cann ओटी स्टैंड) और इसे अपने दृश्य मॉडल पर एक संबंधित संपत्ति के साथ बदल दिया जिसमें ड्रॉपडाउन के लिए संभावित विकल्प होंगे।

+3

मैंने int को शून्य बना दिया और यह अभी भी नियंत्रण में डेटा सत्यापन तत्वों को लिखने में विफल रहता है – Peter

3

मुझे एक ही समस्या थी।और ध्यान दिया कि ऐसा तब होता है जब DropDownList ViewBag या ViewData से पॉप्युलेट किया जाता है। यदि आप @ HTML.DropDownListFor (model => model.SomeChoice, Model.SomeChoice, "select ...") लिखेंगे, जैसा उपर्युक्त उदाहरण सत्यापन गुण लिखा होगा।

+1

यह चरम पर निराशाजनक है। मैं मॉडल से अपनी सभी चुनिंदा सूची को 'व्यूडाटा' में निकालता हूं ताकि सूची 'UIHIn't आधारित विशेषता में सूची नाम से पहुंच योग्य हो। – ProfK

+0

जानकारी निराशाजनक, लेकिन जानना उपयोगी है। अफसोस की बात है कि वास्तविक दुनिया को शायद ही कभी दृढ़ता से टाइप किया जाता है। – ItinerantEngineer

0

जो लोग यहां केंडो ड्रॉपडाउन सूची में एक ही व्यवहार की तलाश में हैं, कृपया अपने कोड में 'आवश्यक' जोड़ें।

@(Html.Kendo().DropDownListFor(m => m) 
    .Name("FeatureId").BindTo((System.Collections.IEnumerable)ViewData[CompanyViewDataKey.Features]) 
    .DataValueField("Id") 
    .DataTextField("Name") 
    .OptionLabel("--Select--") 
    .HtmlAttributes(new { title="Select Feature", required="required"}) 

)

[आवश्यक] viewmodel में विशेषता मेरे लिए काम नहीं किया था, लेकिन Htmlattributes में ऊपर जोड़ने किया था। उम्मीद है कि यह किसी की मदद करता है।

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