5

मैं इस कक्षाएं जो का उपयोग कर इकाई की रूपरेखा कोड पहले मैप किया गया है है:ASP.NET MVC 3 एक-से-अनेक फार्म

public class Person 
{ 
    public int PersonId { get; set; } 
    public string Name { get; set; } 
    //... additional properties 
    [Required] 
    public virtual ICollection<Address> Addresses { get; set; } 
} 
public class Address 
{ 
    public int AddressId { get; set; } 
    public string Street { get; set; } 
    //... additional properties 

    public int PersonId { get; set; } 
    public virtual Person Person { get; set; } 
} 

तो, ASP.NET MVC 3 का उपयोग, मैं कैसे संपादित दृश्य से प्रदर्शन कर सकते हैं व्यक्ति के लिए केवल एक फॉर्म में किसी पते के भीतर सभी व्यक्ति संपत्तियों को भरने के लिए?

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Person</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Adresses.FirstOrDefault().Street) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Adresses.FirstOrDefault().Street) 
      @Html.ValidationMessageFor(model => model.Adresses.FirstOrDefault().Street) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

इस डेटाबेस से स्ट्रीट के साथ आदानों को दिखाने के लिए ठीक काम करता है, लेकिन सबमिट करते हैं, स्ट्रीट does not को परिवर्तन जब मैं करता हूँ।

[HttpPost] 
public ActionResult Edit(int id, FormCollection formCollection) 
{ 
    Person person = unityOfWork.PersonRepository.GetById(id); 

    UpdateModel<Person>(person); 

    if (ModelState.IsValid) 
    { 
     unityOfWork.PersonRepository.Update(person); 
     unityOfWork.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return View(person); 
} 

उत्तर

3

मॉडल बाइंडर को संग्रह को ठीक करने के तरीके के कारण, यह संघर्ष करेगा क्योंकि प्रासंगिक आईडी मौजूद नहीं है।

इस स्क्रीन के लिए व्यूमोडेल बनाना और इसके और अंतर्निहित डोमेन मॉडल के बीच अनुवाद करना बेहतर होगा।

यदि आप सभी पते संपादित करने की सुविधा प्रदान कर रहे थे, तो मैं Steve Sanderson's BeginCollectionItem helper का उपयोग करूंगा। लेकिन चूंकि आप केवल एक ही पते को संपादित कर रहे हैं, एक व्यक्ति संपत्ति के साथ एक नया व्यूमोडेल क्लास और अलग पता संपत्ति आसान होगी, या उस वर्ग का उपयोग करें जिसमें इस दृश्य से संबंधित व्यक्ति और पते से गुण शामिल हैं।

मैं चिंता के पृथक्करण का एक बड़ा समर्थक हूं। आपके आवेदन में तार्किक रूप से तीन मॉडल हैं; इकाई मॉडल जो आपके डेटाबेस में डेटा स्टोरेज के कार्यान्वयन का वर्णन करता है, दृश्य मॉडल जो यूआई में डेटा प्रतिनिधित्व के कार्यान्वयन का वर्णन करता है और डोमेन मॉडल जो आपके आवेदन के भीतर डेटा का तार्किक प्रतिनिधित्व है। प्रत्येक उद्देश्य के लिए एक ही मॉडल का उपयोग करना मोहक है, जैसा कि आप यहां कर रहे हैं। लेकिन जैसे ही आपकी आवश्यकताओं को कोई छोटा नहीं हो जाता है, यह बोझ बन जाता है, इसलिए आप कक्षाओं को बनाने से बेहतर होते हैं जो आपको सबसे अच्छी तरह से काम करते हैं।

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