2011-02-16 16 views
10

मैं इसके लिए एक नियंत्रक और यूनिट परीक्षण लिख रहा हूं, जब मैं कुछ तरीकों से आया (समान रूप से वैध मुझे लगता है) कुछ करने के लिए। मेरे सभी मॉडलों में एक IsValid प्रॉपर्टी है, जिसे मैं मॉडल से पूछने के लिए जांच सकता हूं कि यह मान्य है या नहीं।ModelState.IsValid या Model.IsValid?

नियंत्रक कार्रवाई विधि पर पोस्टबैक पर, यदि मॉडल मान्य है तो मैं सहेजना चाहता हूं, अन्यथा मैं उपयोगकर्ता को अपनी त्रुटियों को सही करने के लिए फ़ॉर्म को फिर से चलाने के लिए चाहता हूं।

मेरा प्रारंभिक विचार यह सत्यापित करना था कि मॉडल से पूछा जा रहा है कि यह वैध है, लेकिन मुझे एहसास हुआ कि मैं ModelState.IsValid भी देख सकता हूं।

क्या किसी के पास एक बनाम दूसरे को देखने का कोई विशेष कारण है?

उत्तर

11

मुझे लगता है कि आपके मॉडल में निर्मित कस्टम व्यापार सत्यापन एक अच्छा दृष्टिकोण है। जिस तरह से मैं इसे संभाल होगा ModelState के लिए किसी भी कस्टम सत्यापन त्रुटियों को जोड़ने के लिए होगा:

if (ModelState.IsValid) 
{ 
    if (!model.IsValid) 
    { 
     ModelState.AddModelError("The model is not valid"); 
    } 
    else 
    { 
     return RedirectToAction("Index"); 
    } 
} 

return View(model); 

इस तरह आपके विचार है कि क्या वे कस्टम या में बनाया गया हैं की परवाह किए बिना सत्यापन त्रुटियों की पहुंच है

6

ModelState। पोस्ट-रीडायरेक्ट-गेट का पालन करने के लिए TempData पर स्थानांतरित किया जा सकता है। उदाहरण:

[HttpPost] 
    [ExportModelStateToTempData] 
    public ActionResult Delete(int id) 
    { 
     if (_service.DeleteTask(id)) 
      return RedirectToAction(ControllerActions.Index); 

     return RedirectToAction(ControllerActions.Edit, new { id }); 
    } 

    [ImportModelStateFromTempData] 
    public ActionResult Edit(int id) 
    { 
     var task = _service.GetTask(id); 
     return View(ControllerActions.Edit, GetEditModel(task)); 
    } 

उपयोगकर्ता/callig/टास्क द्वारा कार्य को हटाने कार्रवाई को हटाएँ, लेकिन कुछ गलत हो जाता है और त्रुटि संदेश दिखाई देता है तो F5 दबा फिर से हटाए जाने नहीं देगा कर सकते हैं। Delete के बाद Edit पर स्थानांतरित किया गया है, सभी त्रुटियों को संपादन पृष्ठ पर दिखाया गया है।

public abstract class ModelStateTempDataTransferAttribute : ActionFilterAttribute 
{ 
    protected static readonly string Key = typeof(ModelStateTempDataTransferAttribute).FullName; 
} 

public class ExportModelStateToTempDataAttribute : ModelStateTempDataTransferAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     //Only export when ModelState is not valid 
     if (!filterContext.Controller.ViewData.ModelState.IsValid) 
     { 
      //Export if we are redirecting 
      if ((filterContext.Result is RedirectResult) || (filterContext.Result is RedirectToRouteResult)) 
      { 
       filterContext.Controller.TempData[Key] = filterContext.Controller.ViewData.ModelState; 
      } 
     } 

     base.OnActionExecuted(filterContext); 
    } 
} 

public class ImportModelStateFromTempDataAttribute : ModelStateTempDataTransferAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     ModelStateDictionary modelState = filterContext.Controller.TempData[Key] as ModelStateDictionary; 

     if (modelState != null) 
     { 
      //Only Import if we are viewing 
      if (filterContext.Result is ViewResult) 
      { 
       filterContext.Controller.ViewData.ModelState.Merge(modelState); 
      } 
      else 
      { 
       //Otherwise remove it. 
       filterContext.Controller.TempData.Remove(Key); 
      } 
     } 

     base.OnActionExecuted(filterContext); 
    } 
} 

Model के साथ एक ही कर कई समस्याएं खड़ी कर जाएगा:

यह आयात करने विशेषताओं/ModelState निर्यात करने के लिए कोड है।

+0

अपने 'ControllerActions' वर्ग क्या है? यह मेरे लिए नया है। –

+0

@ मैट ग्रीर: यह केवल वर्गों के निरंतर नामों के साथ वर्ग है, बस उन्हें दृढ़ता से टाइप करने के लिए। यदि आप स्ट्रोनली टाइप किए गए नामों के साथ खेलना चाहते हैं, तो टी 4 एमवीसी शायद जाने का तरीका है। – LukLed

+0

तो बस कॉन्स स्ट्रिंग का संग्रह? ड्रैट, मैं उम्मीद कर रहा था कि आपके पास जादू तारों से बचने के लिए एक चालाक समाधान था। हाल ही में .NET :) –

0

आप त्रुटियों के संग्रह के माध्यम से भी गणना कर सकते हैं और आउटपुट में सटीक त्रुटि संदेश लिख सकते हैं।

else if (!ModelState.IsValid) 
{ 
    List<ModelError> modelErrors = new List<ModelError>(); 
    ModelErrorCollection errors = new ModelErrorCollection(); 
           ; 
    // got to the model and look at the Array of Values 
    foreach (var item in ModelState) 
    { 
     if (item.Value.Errors.Count != 0) 
     { 
      // get the error 
      errors = item.Value.Errors; 
      modelErrors.Add(errors.Single()); 
     } 
    } 

    if (modelErrors.Count != 0) 
    { 
     foreach (var error in modelErrors) 
     { 
      Debug.WriteLine(error.ErrorMessage); 
     } 
     } 

...

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