2012-10-29 17 views
6

मैं एमवीसी 4 पर लिखे गए एक प्रोजेक्ट पर काम कर रहा हूं जिसमें विज़ार्ड जैसी व्यवहार के कई उदाहरण मिल गए हैं - कुछ विचारों की श्रृंखला जो आधा भरे मॉडल को पास करती हैं। दूसरे दृश्य नियंत्रण से शुरू करने के लिए प्रारंभ में गैर-मान्य के रूप में दिखाया गया है (जो तार्किक - मॉडल है, नियंत्रक विधि को पास किया गया है, संबंधित गुण खाली हैं)। वर्तमान में ModelState.Clear(); समाधान का उपयोग किया जाता है, लेकिन इसे तर्क के रूप में मॉडल के साथ प्रत्येक विधि में डालकर बदसूरत लगती है। दृष्टिकोण के साथ एक ही यहां पाया Disable Model Validation in Asp.Net MVCएमवीसी 4 मॉडल सत्यापन को अक्षम कैसे करें?

ModelBinders.Binders[typeof(MyModelType)] = new NonValidatingModelBinder(); 

परियोजना भी कई मैन्युअल रूप से प्रत्येक एक रजिस्टर करने के लिए मिल गया है (100 से अधिक) मॉडल वर्गों।

क्या कोई आसान तरीका है (शायद .config में कुंजी) जो मॉडल सत्यापन पूरी तरह से बंद कर देता है?

+3

व्यक्तिगत रूप से, मुझे लगता है कि मैं एक जादूगर कदम के लिए एक अलग ViewModel का उपयोग करेंगे। यह आपको सत्यापन की अनुमति देने की अनुमति देगा जहां आपको इसकी आवश्यकता है (यानी वर्तमान विज़ार्ड चरण से मूल्यों पर!)। –

उत्तर

8

जोड़ने के लिए मत भूलना मैं इसे इस काम कर सकता था पता नहीं है, लेकिन आप इस (बूटस्ट्रैप कोड या Global.asax)

ModelValidatorProviders.Providers.Clear(); 
+0

मैंने इसे चेक किया। यह कोड काम करता है। मेरी प्रोजेक्ट में मैं इसका उपयोग नहीं कर सकता क्योंकि क्लियर किए गए संग्रह से 'DataAnnotationsModelValidatorProvider' द्वारा बनाए गए सत्यापनकर्ता क्लाइंट-साइड वैधकर्ताओं (डिफ़ॉल्ट" * "के बजाय त्रुटि संदेश प्राप्त करने के लिए उपयोग किए जाते थे)। लेकिन यह मेरे प्रश्न का सबसे सरल जवाब है। – user1782982

+0

यह मेरे लिए काम नहीं करता है, और मुझे समझ में नहीं आता क्यों –

2

मुझे web.config या ऐसा कुछ विकल्प में सभी विकल्पों के बारे में पता नहीं है। लेकिन आप इस इस्तेमाल कर सकते हैं: तो यह NonValidatingModelBinder करने के लिए अपने विधानसभा में सभी कक्षाएं जोड़ देगा

Assembly.GetExecutingAssembly() 
    .GetTypes() 
    .Where(t => t.IsClass && t.Namespace == "Your.Name.Space") 
    .ToList() 
    .ForEach(t => ModelBinders.Binders[t] = new NonValidatingModelBinder()); 

या

typeof(MyModelType) 
    .Assembly 
    .GetTypes() 
    .Where(t => t.IsClass && t.Namespace == "Your.Name.Space") 
    .ToList() 
    .ForEach(t => ModelBinders.Binders[t] = new NonValidatingModelBinder()); 

या && t.Namespace == "Your.Name.Space" हिस्सा निकालें।

using System.Linq;

4

का प्रयास किया मैं जानता हूँ कि यह नहीं है वास्तव में अपने प्रश्न का उत्तर, लेकिन सिर्फ मेरी टिप्पणी पर विस्तार करने के लिए: -:

public class MyModel 
{ 
    [Required] 
    public string Foo { get; set; } // Populated in step 1 
    [Required] 
    public string Bar { get; set; } // Populated in step 2 
} 
-

ऐसा लगता है कि आप की तरह कुछ है लगता है

जब आप चरण 1 पोस्ट करते हैं तो आपको कोई समस्या है क्योंकि उपयोगकर्ता ने अभी तक Bar के लिए कोई मान दर्ज नहीं किया है, इसलिए ModelStateError है।

मेरे पसंदीदा समाधान, बल्कि अपने सतत मॉडल के सत्यापन के साथ चारों ओर गंदगी के लिए कोशिश कर रहा से, उदाहरण के लिए, प्रत्येक जादूगर कदम के लिए एक ViewModel के साथ अपने मॉडल कार्यान्वयन से अपने दृश्य कार्यान्वयन दसगुणा होगी: -

public class MyModel 
{ 
    [Required] 
    public string Foo { get; set; } 
    [Required] 
    public string Bar { get; set; } 
} 

public class StepOneModel 
{ 
    [Required] 
    public string Foo { get; set; } 
} 

public class StepTwoModel 
{ 
    // This really depends on the behaviour you want. 
    // In this example, the model isn't persisted until 
    // the last step, but you could equally well persist 
    // the partial model server-side and just include a 
    // key in subsequent wizard steps. 
    [Required] 
    public StepOneModel StepOne { get; set; } 

    [Required] 
    public string Bar { get; set; } 
} 

आपका नियंत्रक क्रियाएँ कुछ देखने की तरह: -:

@model StepOneModel 
@using (html.BeginForm()) { 
    @html.EditorFor(x => x.Foo); 
} 
-

public ActionResult StepOne() 
{ 
    return View(new StepOneViewModel()); 
} 
[HttpPost] 
public ActionResult StepOne(StepOneViewModel model) 
{ 
    if(ModelState.IsValid) 
    { 
    var stepTwoModel = new StepTwoViewModel() 
    { 
     StepOne = model 
    }; 

    // Again, there's a bunch of different ways 
    // you can handle flow between steps, just 
    // doing it simply here to give an example 
    return View("StepTwo", model); 
    } 

    return View(model); 
} 
[HttpPost] 
public ActionResult StepTwo(StepTwoViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
    // You could also add a method to the final ViewModel 
    // to do this mapping, or use something like AutoMapper 
    MyModel model = new MyModel() 
    { 
     Foo = model.StepOne.Foo 
     Bar = model.Bar 
    }; 

    this.Context.MyModels.Add(model); 
    this.Context.SaveChanges(); 
    } 

    return View(model); 
} 

आपका StepOne दृश्य तरह दिखता है

आपका StepTwo दृश्य तरह दिखता है: -

@model StepTwoModel 
@using (html.BeginForm("StepTwo")) { 
    @html.HiddenFor(x => x.StepOne); 
    @html.EditorFor(x => x.Bar); 
} 

प्रमुख लाभ सिर्फ मॉडल सत्यापन को बंद करने है कि आप अपने ViewModel पर वर्तमान चरण के लिए मान्यता आवश्यकताओं को रख सकते हैं की तुलना में - आपको लगता है कि सुनिश्चित कर सकते हैं सब चरण एक से आगे बढ़ने से पहले चरण एक के मान वैध हैं।

  • आप एक अधिक RESTful दृष्टिकोण चाहते हैं (जहां अपने नियंत्रक परवाह नहीं करता कि डेटा एक जादूगर शैली दृश्य से आ रही है) एक और लोकप्रिय समाधान एक <div> क्लाइंट साइड में हर कदम रैप करने के लिए है और उपयोगकर्ता प्रगति के रूप में उन्हें छुपाने/दिखाने के लिए जावास्क्रिप्ट का उपयोग करें।

  • यदि आपके मॉडल को चरणों के बीच जारी रखने की आवश्यकता है, तो आपको अपने मॉडल पर सत्यापन प्रमाणीकरण के बारे में सोचना होगा, और उनका क्या मतलब है। यदि आपने User.DateOfBirth को Required के साथ एनोटेट किया है, लेकिन आपको इसे चरणबद्ध होने से पहले इसे जारी रखने में सक्षम होना चाहिए, तो वास्तव में User.DateOfBirth आवश्यक नहीं है (उदाहरण के लिए ईएफ कोड फर्स्ट कॉलम को पूर्ण नहीं कर सकता क्योंकि हमें आवश्यकता है इस बीच शून्य मूल्यों को जारी रखने में सक्षम होने के लिए)। बाद में अपना पूरा मॉडल सत्यापित करने के लिए आपको कुछ सशर्त सत्यापन (उदा। IValidatableObject, MvcFoolproof, Fluent Validation) करने की आवश्यकता होगी।

+0

+1 iain - अच्छा सारांश :) –

0
@{ 
HtmlHelper.ClientValidationEnabled = false; 
} 
संबंधित मुद्दे