2013-06-09 9 views
5

का उपयोग कर मॉडल में कुछ फ़ील्ड को अपडेट करने के लिए कैसे बचें I asp.net mvc 4 और EF के लिए नया हूं। मैं उपयोगकर्ता मॉडल बना रहा हूं जो उपयोगकर्ता की जानकारी बनाता/अपडेट करता है। मॉडल के लिए कोड निम्नानुसार है:एएसपीनेट एमवीसी 4

.... 
public int UserID { get; set; } 

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

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

[Compare("Password")] 
public string VerifyPassword { get; set; } 
..... 
SOME OTHER FIELDS COMES HERE 
...... 

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

public ActionResult Edit(User user) 
{ 
    ModelState.Remove("Password"); 
    ModelState.Remove("VerifyPassword"); 
    ModelState.Clear(); 
    if (ModelState.IsValid) 
    { 
    db.Entry(user).State = EntityState.Modified; 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
    } 
} 

यह मैं ModelState.IsValid = सच दे लेकिन अद्यतन करने के लिए विफल रहता है। कृपया मुझे इस समस्या का समाधान दें।

अग्रिम धन्यवाद ..

उत्तर

3
  1. आप मैन्युअल रूप से क्षेत्रों है कि आप केवल अद्यतन कर रहे हैं की स्थापना की और परिवर्तन बचा सकता है।

  2. आप पहले अपने डेटाबेस से लिया गया मान रीसेट कर सकते हैं। निम्नलिखित की तरह कुछ (कृपया किसी भी त्रुटि को माफ)

    var userFromDb = db.Users.Where(u => u.UserID == user.UserID).First(); 
    user.Password = person.Password; 
    user.VerifyPassword = person.VerifyPassword; 
    
    db.Entry(person).CurrentValues.SetValues(user); 
    db.SaveChanges(); 
    
  3. कस्टम मॉडल बांधने की मशीन है कि केवल प्रासंगिक क्षेत्रों अद्यतन करता है बनाएँ।

+1

उत्तर के लिए धन्यवाद। जैसा आपने कहा था मैंने वही किया। UserID द्वारा रिकॉर्ड ले कर और मैंने केवल उन्हीं मानों को सेट किया है जिन्हें मैं अपडेट करना चाहता हूं, पासवर्ड और अन्य फ़ील्ड को छोड़कर जिन्हें मैं अपडेट नहीं करना चाहता हूं। यह मेरे लिए काम करता है। धन्यवाद। – CodeWarrior

+0

कोई समस्या नहीं, मदद करने में खुशी हुई। – hutchonoid

+0

इससे माँ ने भी मदद की! बस थोड़ा सुधार: कार सी = डीबी.कार्स.फिंड (कार.आईडी); – stefan

0

आपकी समस्या को हल करने के कुछ तरीके हैं (जैसा कि उनके उत्तर में उपयोगकर्ता हचोनॉयड द्वारा वर्णित है)। मुझे लगता है कि संपादन विकल्प के लिए मॉडल के रूप में आपके User का उपयोग करने का सबसे अच्छा विकल्प नहीं होगा क्योंकि यह स्पष्ट रूप से इस मामले में इसका उद्देश्य नहीं है। इसके बजाय एक अलग UserEditModel कक्षा बनाएं जिसमें सभी उपयोगकर्ता गुण हैं जो आप अपने संपादन दृश्य पर रखना चाहते हैं और उन्हें उचित सत्यापन गुणों के साथ एनोटेट करें जैसा आप मानक करेंगे। फिर अपने संपादन दृश्य में मॉडल फॉर्म User से UserEditModel बदलें। - उसके गुण और FromUser विधि है जो का एक उदाहरण बन जाएगा

[HttpGet] 
public ActionResult Edit(int userId) 
{ 
    var user = db.Users.SingleOrDefault(u => u.UserID == userId); 
    if user != null) 
    { 
     return View(UserUpdatModel.FromUser(user)); 
    } 
    // do whatever you do to handle errors 
} 

[HttpPost] 
public ActionResult Edit(UserUpdateModel user) 
{ 
    if (ModelState.IsValid) 
    { 
     var userToUpdate = db.Users.SingleOrDefault(u => u.UserID == user.UserID); 
     if (userToUpdate != null) 
     { 
      // update fields in userToUpdate with data from user 
      db.SaveChanges(); 
     } 
    } 
    // do whatever you do to handle errors 
} 

मैं सादगी के लिए कुछ कोड ommited है (त्रुटि हैंडलिंग या UserEditModel की सामग्री की तरह: अपने नियंत्रक में आप कुछ नीचे दिए गए कोड को समान होगा खुद को प्रदत्त User पर आधारित)। उम्मीद है की वो मदद करदे।

+0

उत्तर के लिए धन्यवाद। मैं डेटा एक्सेस के लिए इकाई ढांचे का उपयोग कर रहा हूं, यह स्वचालित रूप से उपयोगकर्ता ect जैसे सभी मॉडल वर्ग उत्पन्न करता है। जैसा कि आपने उपरोक्त कहा है, मैं नया मॉडल कैसे बना सकता हूं। मैंने उपयोगकर्ता इकाई बनाई है जो यह मेरी .edmx फ़ाइल के तहत User.tt दिखाती है जिसमें उसमें नया मॉडल जोड़ने का कोई विकल्प नहीं है। कृपया मुझे बताएं कि क्या मैं गलत हूं क्योंकि मैं एमवीसी और ईएफ के लिए नया हूं। – CodeWarrior

+0

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

+0

क्या यह अद्यतन उपयोगकर्ता के लिए मूल मान प्राप्त करने के लिए कोई अन्य डेटाबेस कॉल नहीं करता है? – isaolmez

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