2011-01-03 17 views
5

नोट: मैं MVC3 + उस्तरा, EF4, CF-CTP5ASP.NET MVC 3 बहु क्षेत्र है कैसे दृश्य बनाएँ पर ICollection संपत्ति के साथ मॉडल के लिए क्षमता का सृजन

  1. कैसे कर सकते हैं का उपयोग कर रहा आप दृश्य को क्लाइंट पर गतिशील रूप से प्रति संगठन एकाधिक पता वर्ग जोड़ने की क्षमता रखने की अनुमति देते हैं, और पोस्ट पर मॉडल के लिए मजबूती से बंधे हैं?

  2. तुम कैसे मॉडल में देखने पार्स मान हो सकते हैं अगर (ModelState.IsValid == गलत) ऐसी है कि अगर आप 3 पते दर्ज और गलत मॉडल पोस्ट, यह संख्या पतों फिर से भरता है और उनके उचित साथ मान?

यहाँ मेरी मॉडल हैं:

public class Organization 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Address> Addresses { get; set; } 
    public virtual ICollection<PhoneNumber> PhoneNumbers { get; set; } 
    ... 
} 

public class Address 
{ 
    public int Id { get; set; } 
    public string Line1 { get; set; } 
    public string Line2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string PostalCode { get; set; } 
    public string Country { get; set; } 
    public int Type { get; set; } 
} 

मैं यह पता लगाने की कैसे आप संगठन के लिए बनाएं कार्रवाई (/ संगठन/बनाएं) हो सकता है कोशिश कर रहा हूँ इस प्रकार की तरह बनाने संभाल (जैसे कि पतों और फोन नंबर प्रस्तुत मॉडल का हिस्सा) हैं:

[HttpPost] 
public ActionResult Create(Organization organization) 
{ 
    if (ModelState.IsValid) 
    { 
     _db.Organizations.Add(organization); 
     _db.SaveChanges(); 
     return RedirectToAction("Details", organization.Id); 
    } 

    return View(organization); 

} 

उत्तर

1

आपका प्रश्न काफी vaste है :) यह अभी जिस तरह आपकी आवश्यकता प्राप्त किया जा सकता से एक है और मुझे यकीन है कि देखते हैं हूँ मुझसे बेहतर।

मैं अपने दूसरे प्रश्न से शुरू करने के लिए जा रहा हूँ:

कैसे आप दृश्य पार्स मॉडल में मान हो सकते हैं अगर (ModelState.IsValid == गलत) इस तरह के है कि यदि आप में प्रवेश 3 एक अमान्य मॉडल को पोस्ट और पोस्ट करें, यह संख्या पते और उनके उचित मानों के साथ फिर से पॉप-अप करता है?

यदि मैं आपके अनुरोध को सही ढंग से समझता हूं तो यह मेरे लिए बहुत आसान लगता है। जवाब एक मॉडल वर्ग सामग्री प्रस्तुत करना और ग्राहक के लिए अवैध मॉडल वापसी बिल्कुल के रूप में आप अपने Create कार्रवाई में क्या कर रहे हैं करने के लिए अपने दृष्टिकोण को बस कोड है।

यदि आपका फॉर्म (और इसके फ़ील्ड) ValidationSummary/ValidationMessage एचटीएमएल हेल्पर्स के साथ सजाए गए हैं, तो आपको सत्यापन संदेश भी देखने जा रहे हैं।

  1. आप कैसे दृश्य ग्राहक पर संगठन को गतिशील प्रति एकाधिक पता कक्षाएं जोड़ने की क्षमता है करने की अनुमति है, और को दृढ़ता से बाध्य पोस्ट पर मॉडल कर सकते हैं?

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

पता सूची पूरी तरह से क्लाइंट पक्ष पर संभाली गई मार्कअप का एक टुकड़ा है, जिसे सर्वर के पक्ष में सही ढंग से बांधने के लिए मॉडल क्लास को इसके इनपुट गुणों के लिए कुछ सरल नामकरण नियमों का पालन करना चाहिए।

डिफ़ॉल्ट मॉडल बाइंडर वर्ग बाँध सही तरीके से अपने प्रपत्र अपने Organization वर्ग के लिए निम्नलिखित स्निपेट का उपयोग

@using (Html.BeginForm()) { 
    @Html.HiddenFor(o => o.Id) 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>My Organization</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> 
     <br /> 
     <div id="container"> 
      <div>Address List</div> 
      @foreach (Address a in Model.Addresses) { 
       Html.EditorFor(a); 
      } 
     </div> 
     <div style="text-align:right;margin-top:14px;"> 
      <input type="submit" id="btnSubmit" value="Save" /> 
     </div> 
    </fieldset> 
} 

स्वचालित रूप से होना करने के लिए फार्म के लिए परिणामी कोड bindable निम्नलिखित

<form action="..." id="..." method="post"> 
    <input type="hidden" name="Id" value="2"> 
    <input type="hidden" name="Name" value="Acme Corporation"> 

    <!-- markup for each address --> 
    <input type="hidden" name="Addresses[0].Id" value="1"> 
    <input type="hidden" name="Addresses[0].Line1" value="Line 1"> 
    <input type="hidden" name="Addresses[0].Line2" value="Line 2"> 
    ... and so on... 
</form> 
के रूप में देखना चाहिए बनाने के लिए

इसकी संपत्तियों को Addresses[index].PropertyName नाम दिया गया है। यदि आप क्लाइंट पर नए पते जोड़ते हैं तो इससे कोई फर्क नहीं पड़ता: जब तक आपका कोड इस नियम का सम्मान करता है तो आपके पास डिफ़ॉल्ट मॉडल बाइंडर आपके लिए नौकरी कर सकता है।

आशा इस मदद करता है

0

मुझे यकीन है कि अगर मैं अपने प्रश्न सही ढंग से समझ लेकिन 1 सवाल करने के लिए मुझे लगता है कि आप एक ViewModel लिए देख रहे हैं सम्मान के साथ नहीं कर रहा हूँ। इस तरह शायद ..

OrganizationViewModel.cs

public class OrganizationViewModel 
{ 
    public OrganizationViewModel(Organization org, IList<Address> addresses) 
    { 
     this.Organization = org; 
     this.Addresses = addresses 
    } 
    public Organization Organization {get;set;} 
    public IList<Address> Addresses {get;set;} 
} 

OrganizationController.cs

public class OrganizationController : Controller 
{ 
    private readonly IOrganizationService _organizationService: //or whatever method you use 
    public OrganizationController(IOrganizationService orgService) 
    { 
     this._organizationService = orgService; 
    } 

    public ActionResult Item(int id) 
    { 
     var org = _organizationService.GetOrganizationById(id); 
     var addresses = _organizationService.GetOrgAddressesByOrgId(id); 
     return View(new OrganizationViewModel(program, addresses)); 
    } 
} 

Item.cshtml

@model OrganizationViewModel 
<h1>@Model.Organization.Name</h1> 
<ul> 
@foreach(var a in Model.Addresses) 
{ 
<li>@a.Line1</li> 
<li>@a.Line2</li>} 
</ul> 

इससे पहले कि मैं कोशिश करते हैं और नंबर 2 का जवाब हो सकता है आप का संकेत देना चाहिए चाहे मैं सही ढंग से प्रश्न 1 समझ रहा हूं। उम्मीद है कि इससे मदद मिलती है।

0

मैं एसक्यूएल को यह LINQ का उपयोग कर में कामयाब रहे। अब मैं इसके बजाय एंटीटी फ्रेमवर्क का उपयोग करने की कोशिश कर रहा हूं, लेकिन यह वास्तव में सब कुछ अधिक जटिल बनाता है। तो मेरे पास आपके लिए कोई समाधान नहीं है, लेकिन शायद मेरा एल 2 एस समाधान मदद कर सकता है?

का उपयोग करते हुए मॉडल मेरी डेटाबेस से उत्पन्न मैं मेरे विचार में ऐसा कर सकता है:

@for (int i = 0; i < Model.Contact.EmailAddresses.Count; ++i) 
{ 
    <li> 
     @Html.TextBoxFor(x => x.Contact.EmailAddresses[i].EmailAddress) 
     @Html.HiddenFor(x => x.Contact.EmailAddresses[i].EmailAddressID) 
    </li> 
} 

मैं एक दृश्य मॉडल वर्ग था:

class ContactViewModel 
{ 
    Contact contact { get; set; } 
} 

यह ठीक काम किया है और मेरी नियंत्रक कार्रवाई में मुझे मिल गया मेरी इसके संपर्क के साथ संपर्क ऑब्जेक्ट। संपर्क ImailAddresses सूची की तरह ही मुझे उम्मीद है।

लेकिन एफई के साथ, मैं उपयोग नहीं कर सकते EmailAddresses संपत्ति अब और डेटाबेस से उत्पन्न पर [i]। सबसे अच्छा मैं के साथ आए हैं है:

@Html.TextBox("Contact.EmailAddresses[" + i + "].EmailAddress", Model.Contact.EmailAddresses.ElementAt(i).EmailAddress) 

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

  • कोई संबंधित समस्या नहीं^_^