2012-06-25 9 views
5

मेरे पास तीन मॉडल हैं जो एक दृश्य मॉडल बनाने के लिए एक साथ आ रहे हैं और मैं "संपादन" पर क्लिक करते समय उस दृश्य मॉडल को संपादित करने में सक्षम होना चाहता हूं। मुझे यह कैसे काम करता है (कहीं भी) का एक सीधा आगे उदाहरण नहीं मिल रहा है।मैं एमवीसी 3 में एक संपादन पृष्ठ से एक दृश्य मॉडल कैसे अपडेट करूं?

मुझे यकीन नहीं है कि मैं सही रास्ते पर जा रहा हूं या नहीं। मैं डेटा के साथ दृश्य प्राप्त करने में सक्षम हूं। इस बिंदु पर, मैं इसे सहेजने में असमर्थ हूं।

किसी भी मदद की सराहना की जाएगी।

धन्यवाद!

मॉडल:

public class Person 
{ 
    [Key] 
    public int Id { get; set; } 

    [MaxLength(20)] 
    [Required(ErrorMessage = "First name is required.")] 
    public string FirstName { get; set; } 

    [MaxLength(20)] 
    [Required(ErrorMessage = "Last name is required.")] 
    public string LastName { get; set; } 
    [MaxLength(40)] 
    [Required(ErrorMessage = "Email is required.")] 
    public string Email { get; set; } 
    [MaxLength(20)] 
    [DataType(DataType.PhoneNumber)] 
    public string Phone { get; set; } 

    public bool Active { get; set; } 
} 


    public class ClientContact 
{ 
    [Key] 
    [ForeignKey("Person")] 
    public int ClientPersonId { get; set; } 
    public int ClientId { get; set; } 
    [MaxLength(40)] 
    public string Title { get; set; } 

    public Person Person { get; set; } 
    [ForeignKey("ClientId")] 
    public Client Client { get; set; } 
} 

    public class Client 
{ 
    [Key] 
    public int ClientId { get; set; } 
    public string Name { get; set; } 
    public bool Active {get;set;} 

} 

देखें मॉडल:

public class ClientContactViewModel 
{ 

    private SimplexDB db = new SimplexDB(); 


    public ClientContactViewModel() 
    { 

    } 


    public ClientContactViewModel(int id) 
    { 
     ClientPersonId = id; 
     InitializeClientContact(); 
    } 

    public int ClientPersonId { get; set; } 


    [Display(Name = "First Name")] 
    public string FirstName { get; set; } 
    [Display(Name = " Last Name")] 
    public string LastName { get; set; } 
    [Display(Name = "Title")] 
    public string Title { get; set; } 
    [Display(Name = "Email Address")] 
    public string Email { get; set; } 
    [Display(Name = "Phone")] 
    public string Phone { get; set; } 
    [Display(Name = "Client Name")] 
    public int ClientId { get; set; } 


    public SelectList Clients 
    { 
     get 
     { 
      return new SelectList(db.Clients, "ClientId", "Name"); 

     } 
    } 

    private void InitializeClientContact() 
    { 
     var contact = db.ClientPersons.Include("Person").Where(x => x.ClientPersonId == ClientPersonId).SingleOrDefault(); 
     if (contact != null) 
     { 
      FirstName = contact.Person.FirstName; 
      LastName = contact.Person.LastName; 
      Title = contact.Title; 
      Email = contact.Person.Email; 
      Phone = contact.Person.Phone; 
      ClientId = contact.ClientId; 

     } 
    } 



} 

नियंत्रक:

   public class ClientContactController : Controller 
    { 
     private database db = new database(); 

// 
     // GET: /ClientContact/Edit/5 

     public ActionResult Edit(int id) 
     { 
      return View(new ClientContactViewModel(id)); 
     } 

     // 
     // POST: /ClientContact/Edit/5 

     [HttpPost] 
     public ActionResult Edit(ClientContactViewModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       db.Entry(model).State = EntityState.Modified; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      return View(model); 
     } 
} 

मैं db.Entry (मॉडल) पर कोई त्रुटि मिलती है .State ... " इकाई प्रकार ClientContactViewModel वर्तमान संदर्भ के लिए मॉडल का हिस्सा नहीं है। "

उत्तर

9

आपका व्यूमोडेल एक इकाई नहीं है। आपको अपनी व्यूमोडेल को अपनी इकाई में मैप करना चाहिए, फिर इकाई की स्थिति को संशोधित करने के लिए सेट करें।

असल में, इसका मतलब है कि आपको अपने इकाई मानों को अपने दृश्य मॉडल मानों के साथ सेट करना चाहिए। आप AutoMapper का उपयोग करें या इसे मैन्युअल रूप से संभाल कर सकते हैं:

[HttpPost] 
    public ActionResult Edit(ClientContactViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      ClientContact contact = db.ClientPersons.Include("Person") 
            .Where(x => x.ClientPersonId == model.ClientPersonId) 
            .SingleOrDefault(); 
      contact.FirstName = model.FirstName; 
      // etc 
      db.Entry(contact).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(model); 
    } 

MVC में ViewModels का उपयोग कर के लिए एक उत्कृष्ट दृष्टिकोण के लिए http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/ देखें।

इसके अलावा, मैं अत्यधिक अनुशंसा करता हूं कि आप अपने व्यूमोडेल में डेटा एक्सेस न करें। अपने नियंत्रक द्वारा उपयोग किए जाने वाले एक रिपोजिटरी में अपने नियंत्रक, या इससे भी बेहतर में ऐसा करें। मॉडल बाइंडिंग उन मॉडलों के साथ अच्छी तरह से नहीं खेलती है जिनमें तर्क है (यानी उन्हें सरल प्राप्त/सेट गुणों से अधिक कुछ नहीं होना चाहिए)।

+0

मैं ऐसा करने के बारे में कैसे जाऊं? क्षमा करें, मैं इसके लिए नया हूं। –

+0

मेरा अद्यतन उत्तर देखें। – jrummell

+0

स्पष्ट होने के लिए, क्या मुझे ऊपर दिए गए कोड के आधार पर अपना दृश्य मॉडल अपडेट करने की आवश्यकता है? आपकी सहायता के लिए धन्यवाद. –

1

आपको अपने मॉडल के गुणों को GET कार्रवाई में व्यूमोडेल में स्थानांतरित करने की आवश्यकता है। पोस्ट कार्रवाई में, अपने मूल मॉडल को डीबी से प्राप्त करें, मॉडल को मॉडल के साथ मॉडल के साथ अद्यतन करें, और फिर परिवर्तनों को सहेजें। आपके मॉडल अनिवार्य रूप से आपके डेटाबेस में तालिकाओं का प्रतिनिधित्व कर रहे हैं। आपका व्यू मॉडल स्क्रीन पर दिखाया गया है।

[HttpPost] 
    public ActionResult Edit(ClientContactViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 

      var client = db.Client.Where(c => c.Id = model.ClientPersonId); 
      client.FirstName = model.FirstName; 

      ...etc through all your properties and other models... 


      db.Entry(model).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(model); 
    } 

ऐसा करने के लिए बहुत ही कम तरीके हैं, लेकिन यह बिना किसी अवतार के विचार को दर्शाता है।

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