लघु में: मैं संपादित दृश्य के अंदर मॉडल के लिए प्रत्येक फ़ील्ड को शामिल किए बिना डीबी प्रविष्टि को सफलतापूर्वक कैसे संपादित करूं?छिपे हुए क्षेत्रों के समूह के बिना सफल मॉडल संपादन
अद्यतन
तो मैं डीबी (एक अनुच्छेद) में एक आइटम है। मैं एक लेख संपादित करना चाहता हूँ। मेरे द्वारा संपादित लेख में कई गुण हैं (आईडी, बनाया गया, डेटक्रेटेड, शीर्षक, बॉडी)। इनमें से कुछ गुणों को कभी भी बदलने की आवश्यकता नहीं है (जैसे आईडी, बनाया गया, डेटक्रेटेड)। तो मेरे संपादन दृश्य में, मैं केवल उन फ़ील्ड के लिए इनपुट फ़ील्ड चाहता हूं जिन्हें बदला जा सकता है (जैसे शीर्षक, बॉडी)। जब मैं इस तरह एक संपादन दृश्य लागू करता हूं, मॉडल बाध्यकारी विफल रहता है। कोई भी फ़ील्ड जिसे मैंने इनपुट की आपूर्ति नहीं की है, कुछ 'डिफ़ॉल्ट' मान पर सेट हो जाती है (जैसे डेटक्रेटेड 01/01/0001 12:00:00 बजे सेट हो जाता है)। यदि मैं प्रत्येक फ़ील्ड के लिए आपूर्ति इनपुट करता हूं, तो सब कुछ ठीक काम करता है और लेख अपेक्षित के रूप में संपादित किया जाता है। मुझे नहीं पता कि यह कहने में सही है कि "मॉडलिंग बाइंडिंग असफल हो जाती है", उतना ही "सिस्टम गलत डेटा वाले फ़ील्ड भरता है अगर संपादन दृश्य में उनके लिए कोई इनपुट फ़ील्ड नहीं दिया गया हो।"
मैं इस तरह से एक संपादन दृश्य कैसे बना सकता हूं कि मुझे केवल उन फ़ील्ड के लिए इनपुट फ़ील्ड की आपूर्ति करने की आवश्यकता है जिन्हें संपादन/आवश्यकता हो सकती है, ताकि जब नियंत्रक में संपादन विधि को कॉल किया जाता है, तो डेटक्रेटेड जैसे फ़ील्ड सही ढंग से आते हैं , और कुछ डिफ़ॉल्ट, गलत मान पर सेट नहीं है? यहाँ मेरी संपादित तरीका है के रूप में यह वर्तमान में खड़ा है: संपादित दृश्य
[HttpPost]
public ActionResult Edit(Article article)
{
// Get a list of categories for dropdownlist
ViewBag.Categories = GetDropDownList();
if (article.CreatedBy == (string)CurrentSession.SamAccountName || (bool)CurrentSession.IsAdmin)
{
if (ModelState.IsValid)
{
article.LastUpdatedBy = MyHelpers.SessionBag.Current.SamAccountName;
article.LastUpdated = DateTime.Now;
article.Body = Sanitizer.GetSafeHtmlFragment(article.Body);
_db.Entry(article).State = EntityState.Modified;
_db.SaveChanges();
return RedirectToAction("Index", "Home");
}
return View(article);
}
// User not allowed to edit
return RedirectToAction("Index", "Home");
}
और अगर यह मदद करता है:
@Html.HiddenFor(model => model.CreatedBy)
@Html.HiddenFor(model => model.DateCreated)
जब:
. . .
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Article</legend>
<p>
<input type="submit" value="Save" /> | @Html.ActionLink("Back to List", "Index")
</p>
@Html.Action("Details", "Article", new { id = Model.Id })
@Html.HiddenFor(model => model.CreatedBy)
@Html.HiddenFor(model => model.DateCreated)
<div class="editor-field">
<span>
@Html.LabelFor(model => model.Type)
@Html.DropDownListFor(model => model.Type, (SelectList)ViewBag.Categories)
@Html.ValidationMessageFor(model => model.Type)
</span>
<span>
@Html.LabelFor(model => model.Active)
@Html.CheckBoxFor(model => model.Active)
@Html.ValidationMessageFor(model => model.Active)
</span>
<span>
@Html.LabelFor(model => model.Stickied)
@Html.CheckBoxFor(model => model.Stickied)
@Html.ValidationMessageFor(model => model.Stickied)
</span>
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Body)
</div>
<div class="editor-field">
@* We set the id of the TextArea to 'CKeditor' for the CKeditor script to change the TextArea into a WYSIWYG editor. *@
@Html.TextAreaFor(model => model.Body, new { id = "CKeditor", @class = "text-editor" })
@Html.ValidationMessageFor(model => model.Body)
</div>
</fieldset>
. . .
मैं इन दो आदानों बाहर छोड़ने के लिए थे, तो संपादन विधि कहा जाता है, वे डिफ़ॉल्ट मान पर सेट हैं। CreatedBy, अशक्त पर सेट है निर्मित 01/01/0001 00:00:00
क्यों वे मान पर सेट नहीं हैं के रूप में वे वर्तमान में डीबी में सेट कर रहे हैं के लिए निर्धारित है?
आप प्रत्येक फ़ील्ड को सेट करने के बजाय TryUpdateModel (मौजूदा आर्टिकल) का भी उपयोग कर सकते हैं। कुछ समाधान बहुत सुरुचिपूर्ण प्रतीत नहीं हो सकते हैं, लेकिन ऑटोमैपर जैसे समाधान हैं, जिनका आप बाद में उपयोग कर सकते हैं, जो इस समस्या को हल करेंगे, लेकिन अभी आपको इसे अभी तक नहीं जानना है। – LukLed
लेकिन अगर यह "सही" तरीका है, तो निश्चित रूप से मैं इसे अभी जानना चाहता हूं;) मैं खुदाई कर रहा हूं और ऐसा लगता है, हां, "व्यूमोडल्स" नामक इन चीजों का उपयोग करने का तरीका है: ए "एक इकाई से जानकारी का एक टुकड़ा दिखाने के लिए रास्ता।" जाहिर है, यह थोड़ा और काम है, लेकिन मॉडल/विचार अधिक जटिल हो जाते हैं क्योंकि वे मजबूत होते हैं, जबकि इन अन्य "ब्रूट फोर्स" विधियों को तोड़ने लगते हैं। –