2011-04-12 14 views
60

पर क्लाइंट साइड सत्यापन अक्षम करें मैं डेटा एनोटेशन और jQuery सत्यापन प्लगइन के साथ एएसपी .NET MVC 3 का उपयोग कर रहा हूं।एएसपी .NET एमवीसी प्रति-फील्ड स्तर

क्या यह चिह्नित करने का कोई तरीका है कि एक निश्चित फ़ील्ड (या कुछ डेटा एनोटेशन) केवल सर्वर-साइड सत्यापित किया जाना चाहिए?

मेरे पास एक मास्किंग प्लगइन वाला एक फ़ोन नंबर फ़ील्ड है, और नियमित अभिव्यक्ति सत्यापनकर्ता उपयोगकर्ता के अंत में पागल हो जाता है। रेगेक्स केवल एक असफल-सुरक्षित है (यदि कोई जावास्क्रिप्ट सत्यापन को हैक करने का फैसला करता है), इसलिए मुझे क्लाइंट पक्ष पर चलाने की आवश्यकता नहीं है। लेकिन मुझे अभी भी क्लाइंट पक्ष चलाने के लिए अन्य सत्यापन पसंद है।

उत्तर

93

पर एक नज़र डालें, मुझे यकीन नहीं है कि यह समाधान एमवीसी 3 पर काम करता है या नहीं। यह निश्चित रूप से एमवीसी 4 पर काम करता है:

फ़ील्ड प्रस्तुत करने से पहले आप रेजर दृश्य में क्लाइंट साइड सत्यापन को अक्षम कर सकते हैं और फ़ील्ड प्रदान किए जाने के बाद क्लाइंट साइड सत्यापन को फिर से सक्षम कर सकते हैं।

उदाहरण:

<div class="editor-field"> 
    @{ Html.EnableClientValidation(false); } 
    @Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" }) 
    @{ Html.EnableClientValidation(true); } 
</div> 

यहाँ हम BatchId क्षेत्र के लिए ग्राहक साइड सत्यापन को अक्षम करें।

इसके अलावा, मैं इस के लिए एक छोटे से सहायक विकसित किया है:

public static class YnnovaHtmlHelper 
{ 
    public static ClientSideValidationDisabler BeginDisableClientSideValidation(this HtmlHelper html) 
    { 
     return new ClientSideValidationDisabler(html); 
    } 
} 

public class ClientSideValidationDisabler : IDisposable 
{ 
    private HtmlHelper _html; 

    public ClientSideValidationDisabler(HtmlHelper html) 
    { 
     _html = html; 
     _html.EnableClientValidation(false); 
    } 

    public void Dispose() 
    { 
     _html.EnableClientValidation(true); 
     _html = null; 
    } 
} 

आप इस प्रकार यह उपयोग करेगा: किसी को भी बेहतर समाधान है, तो

<div class="editor-field"> 
    @using (Html.BeginDisableClientSideValidation()) { 
     @Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" }) 
    } 
</div> 

कृपया मुझे बताएँ!

इस सहायता की आशा करें। किसी भी System.ComponentModel.DataAnnotations विशेषताओं की वजह से

@Html.TextBoxFor(m => m.BatchId, new { data_val = "false" }) 

यह data-val='true' विशेषता को पार कर जाएगी कि MVC जोड़ता है:

+3

एमवीसी 4 का उपयोग करके बहुत अच्छा काम करता है ... – ChrFin

+2

अच्छा, सिवाय इसके कि यह शुरू होने के बावजूद सत्यापन को चालू करता है। –

+3

निश्चित रूप से इसे बढ़ाया जा सकता है! –

7

मान लें कि आप डिफ़ॉल्ट अविभाज्य सत्यापन का उपयोग करते हैं, तो आप क्लाइंट पक्ष पर नियमों को हटाने के लिए कुछ जावास्क्रिप्ट का उपयोग कर सकते हैं। Plugins/Validation/rules

66

आप बंद क्लाइंट साइड विनीत सत्यापन एक भी क्षेत्र के लिए एक data-val='false' विशेषता जोड़कर बदल सकते हैं। एचटीएमएल तत्व को अभी भी अन्य सत्यापन विशेषताओं (जैसे डेटा-वैल-आवश्यक) के साथ सजाया जाएगा लेकिन उनका कोई प्रभाव नहीं पड़ेगा।

(नोट अंडरस्कोर data_val में ऊपर। MVC स्वचालित रूप से अंडरस्कोर हाइफ़न के लिए अनाम प्रकार के गुणों में बदल देता है, जब एचटीएमएल प्रतिपादन तो data_valdata-val हो जाता है)

+0

जब तक मैं अंडरस्कोर नहीं डालता, आईआईएस मुझे अपवाद देता है। कंपाइलर त्रुटि संदेश: CS0746: अमान्य अनाम प्रकार सदस्य घोषणाकर्ता। बेनामी प्रकार के सदस्यों को सदस्य असाइनमेंट, सरल नाम या सदस्य पहुंच के साथ घोषित किया जाना चाहिए। – csharpforevermore

+2

मेरे लिए काम नहीं किया –

+1

यह एक आकर्षण की तरह काम करता है और मुझे अभी तक मिली इस समस्या का सबसे साफ समाधान है। –

11

MVC5 उपयोग jQuery।मान्य

http://jqueryvalidation.org/rules/

आप MVC5 क्लाइंट साइड में सत्यापन निकालने चाहते हैं तो आपको निम्न कार्य करने होंगे:

'myinput'

$("#myinput").rules("remove"); 

विशिष्ट सत्यापन

पर सभी सत्यापन निकालने
$("#myinput").rules("remove", "min max"); 

v को सूचीबद्ध करना alidations मदद कर सकते हैं

$("#myinput").rules(); 

फिर आप अपने कोड को दूर करने के पीछे मैन्युअल रूप से अपने मॉडल या अलग ढंग से मान्य करने के लिए क्योंकि ModelState.IsValid झूठी हो जाएगा की आवश्यकता होगी। ModelState.Clear() और TryValidateModel का उपयोग करना आसान हो सकता है।

संपादित करें:

को अक्षम करने से नियंत्रण भी सत्यापन निकालने के।

$("#myinput").attr('disabled', disabledValue); 
4

दिए गए परिदृश्य में इस लक्ष्य को प्राप्त करने के लिए, हमें दो बदलाव करने की आवश्यकता है।

क्लाइंट साइड

ग्राहक साइड सत्यापन अक्षम करने के लिए, हम बल द्वारा उसे निष्क्रिय करने की जरूरत है।

@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @data_val = "false" , @class = "form-control"} }) 

@ data_val = "false" पर ध्यान दें। यह इस क्षेत्र पर सत्यापन अक्षम कर देगा।

सर्वर साइड (कार्रवाई में)

जब मॉडल पद कार्रवाई पर मान्य है, ModelState.IsValid हमेशा अवास्तविक लौटाते हैं क्योंकि पासवर्ड प्रदान नहीं की है। यहां हमें मॉडल को वर्तमान पासवर्ड प्रदान करना होगा और मॉडल को दोबारा सत्यापित करना होगा।

var userObj = db.Users_Info.Where(a => a.Id == users_Info.Id).FirstOrDefault(); 
if (String.IsNullOrEmpty(users_Info.Password)) 
{ 
    users_Info.Password = userObj.Password; 
} 
ModelState.Clear(); 
TryValidateModel(users_Info); 

पहले हम डेटाबेस जो हम बाद में उपयोग कर रहे हैं पासवर्ड प्रदान नहीं की है वर्तमान मॉडल के लिए आवंटित करने के लिए में बचाया वर्तमान जानकारी पुनः प्राप्त मुझे स्पष्ट करने दें। आखिरी दो लाइनें वास्तव में ModelState.IsValid पर अद्यतन परिणाम लौटने के लिए मॉडलस्टेट को रीसेट कर देती हैं।

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