दिलचस्प पोस्ट
कोणीय जेएस में ऑब्जेक्ट प्रॉपर्टी से कैसे फ़िल्टर करें रीसाइक्लर केंद्र में क्षैतिज स्क्रॉल तस्वीर देखें पायथन फ़ंक्शन पॉइंटर पायथन के जरिए एक html निर्देशिका सूची कैसे उत्पन्न करें स्थैतिक आयात को शामिल करने के लिए एक्लिप्स ऑप्टीमाइज़ आयात कार्य है। एक एएसपी। नेट एमवीसी वेब अनुप्रयोग में बुरा व्यवहार माना जाता है? अजगर की सूची से मूल्य की एक सूची मिल रही है सबसोनिक बनाम NHibernate OpenSSL के SHA256 फ़ंक्शन का उपयोग कैसे करें जावा 8 स्ट्रीम की .min () और .max (): यह संकलन क्यों करता है? एसोसिएट लिआ में मान द्वारा तालिका को छांटने सी पंक्ति से फ़ाइल लाइन पढ़ें पायथन अनुकरण keydown परियोजना की त्रुटि: क्यूटी में अज्ञात मॉड्यूल (एस): वेबकिटविड्ट्स स्टैक पर आवंटित चर पर कॉलिंग हटाना

TryUpdateModel, एएसपी। NET MVC 3 का वास्तविक उदाहरण

मैं समझ नहीं सकता, TryUpdateModel का उपयोग कैसे करें और एक ही समय में MVC आर्किटेक्चर को बचाएं।

यदि मैं गलत नहीं हूँ, तो डेटाकॉन्टेक्सस के साथ काम करना आदर्श मॉडल में होना चाहिए। तो, ऐसे कोड

var db=new TestEverybody();//it is class, which was generated by EntityFramework var currentTesting=db.Testing.(t => t.id == id).First(); 

मॉडल में स्थित होना चाहिए, नियंत्रक में नहीं, क्या यह नहीं होना चाहिए?

लेकिन TryUpdateModel उपयोग के सामान्य उदाहरण निम्नलिखित हैं:

  public ActionResult Edit(Testing obj)//Testing collection { var db = new TestEverybody(); var currentTesting=db.Testing.(t => t.id == obj.id).First(); TryUpdateModel(currentTesting); db.SaveChanges(); return RedirectToAction("Index"); } 

इस तरह से एमवीसी वास्तुकला तोड़ नहीं है? हम नियंत्रक में डेटाबेस के साथ काम करते हैं, विशेष मॉडल वर्ग में नहीं।

तो, एक असली परियोजना में TryUpdateModel का उपयोग करने का सबसे अच्छा तरीका क्या है?

Solutions Collecting From Web of "TryUpdateModel, एएसपी। NET MVC 3 का वास्तविक उदाहरण"

चूंकि ओपी ने पूछा, यहां व्यू मॉोडल पैटर्न का एक उदाहरण है, या जैसा मैं इसे कॉल करना चाहता हूं – एएसपी.नेट एमवीसी ने ठीक से काम किया है।

तो एक विशिष्ट मॉडल का उपयोग क्यों करें

  1. आपको केवल जानकारी को अपने दृष्टिकोण में ही पास करना चाहिए, जिसकी जरूरत है।
  2. अक्सर आपको अतिरिक्त व्यू-मेटा-डेटा (जैसे शीर्षक / विवरण विशेषताएँ) जोड़ना होगा। ये आपकी संस्थाओं पर आधारित नहीं हैं
  3. TryUpdateModel / UpdateModel का उपयोग करना गलत है उपयोग न करें (मैं क्यों समझाऊंगा)
  4. यह बहुत दुर्लभ है कि आपके दृश्य-मॉडल आपकी संस्थाओं से बिल्कुल मेल खाते हैं। लोग अक्सर अपनी संस्थाओं को अतिरिक्त क्रैफ्ट जोड़ते हैं या (अधिक बेहतर नहीं) बस दृढ़तापूर्वक टाइप किए गए मॉडल मॉडल गुणों के बजाय ViewBag का उपयोग करते हैं
  5. यदि आप एक ORM का उपयोग कर रहे हैं तो आप आलसी लोड किए गए गुणों (N + 1) के साथ समस्याओं में चला सकते हैं। आपके विचारों को प्रश्नों को जारी नहीं करना चाहिए।

हम एक साधारण इकाई से शुरू करेंगे:

 public class Product { public int Id {get;set;} public string Name {get;set;} public string Description {get;set;} public decimal Price {get;set;} } 

और मान लें कि आपके पास एक सरल रूप है जहां उपयोगकर्ता केवल Name और उत्पाद का Description अपडेट कर सकता है। लेकिन आप (बहुत लालची) TryUpdateModel का उपयोग कर रहे हैं

इसलिए मैं किसी भी संख्या के उपकरणों का उपयोग करता हूं (जैसे कि फिडलर) खुद को एक पद बनाने के लिए और निम्न भेजें:

नाम = WhatverIWant और विवरण = UnluckyFool और कीमत = 0

अच्छी तरह से एएसपी.नेट एमवीसी मॉडल बाइंडर इनपुट फॉर्म संग्रह का निरीक्षण करने जा रहा है, यह देखें कि ये गुण आपके इकाई में मौजूद हैं और आप उन्हें अपने लिए बाध्य कर देते हैं। इसलिए जब आप अपने डेटाबेस से निकाले गए इकाई पर "TryUpdateModel" कहते हैं, तो सभी मिलान गुणों को अपडेट किया जाएगा (मूल्य!) सहित। एक नया विकल्प के लिए समय

विशिष्ट मॉडल देखें

 public class EditProductViewModel { [HiddenInput] public Guid Id {get;set;} [Required] [DisplayName("Product Name")] public string Name {get;set;} [AllowHtml] [DataType(DataType.MultilineText)] public string Description {get;set;} } 

इसमें हमारे गुणों में केवल गुण हैं सूचना हमने कुछ सत्यापन विशेषताओं, प्रदर्शन विशेषताओं और कुछ एमवीसी विशिष्ट विशेषताओं को भी जोड़ा है।

हमारे विचार मॉडल में हमारे पास क्या सीमित नहीं है, यह आपके विचारों को बहुत क्लीनर बना सकता है उदाहरण के लिए, हमारे दृश्य में निम्नलिखित होने के द्वारा हम अपने पूरे संपादन फॉर्म को प्रस्तुत कर सकते हैं:

 @Html.EditorFor(model => model) 

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

फॉर्म को पोस्ट करना

 [HttpPost] public ActionResult EditProduct(EditProductViewModel model) { var product = repository.GetById(model.Id); if (product == null) { return HttpNotFound(); } // input validation if (ModelState.IsValid) { // map the properties we **actually** want to update product.Name = model.Name; product.Description = model.Description; repository.Save(product); return RedirectToAction("index"); } return View(model) } 

यह इस कोड से काफी स्पष्ट है जो यह करता है। जब हम अपनी इकाई को अपडेट करते हैं तो हम किसी भी अवांछनीय प्रभाव नहीं रखते हैं क्योंकि हम स्पष्ट रूप से हमारे इकाई पर गुण स्थापित कर रहे हैं।

मुझे आशा है कि यह दृश्य-मॉडल पैटर्न को बताता है कि आप इसका उपयोग करना चाहते हैं।

तो, ऐसा कोड मॉडल में स्थित होना चाहिए, न कि नियंत्रक में, क्या यह नहीं होना चाहिए?

जरुरी नहीं। निजी तौर पर मैं एक रिपॉजिटरी में डेटा एक्सेस कोड डालना पसंद करता हूं। फिर नियंत्रक को कुछ विशिष्ट रिपॉजिटरी कार्यान्वयन के लिए कंस्ट्रक्टर इंजेक्शन का उपयोग करें (उदाहरण के लिए अगर मैं ईएफ का उपयोग कर रहा था, तो मैं ईएफ रिपोजिटरी कार्यान्वयन लिखूंगा)। तो नियंत्रक इस तरह दिखाई देगा:

 public class HomeController: Controller { private readonly IMyRepository _repository; public HomeController(IMyRepository repository) { _repository = repository; } public ActionResult Edit(int id) { var currentTesting = _repository.GetTesting(id); TryUpdateModel(currentTesting); _repository.SaveChanges(); return RedirectToAction("Index"); } }