2010-11-20 10 views
17

को देखते हुए निम्नलिखित प्रकारमैं ASP.NET MVC 3 के साथ एक IENumerable <T> कैसे संपादित करूं?

public class SomeValue 
{ 
    public int Id { get; set; } 
    public int Value { get; set; } 
} 

public class SomeModel 
{ 
    public string SomeProp1 { get; set; } 
    public string SomeProp2 { get; set; } 
    public IEnumerable<SomeValue> MyData { get; set; } 
} 

मैं प्रकार SomeModel जो SomeProp1 और SomeProp2 और उसके बाद के लिए सामान्य पाठ फ़ील्ड होते हैं के लिए एक संपादन प्रपत्र बनाना चाहते हैं एक मेज SomeModel.MyData संग्रह में प्रत्येक SomeValue के लिए एक पाठ क्षेत्र युक्त ।

यह कैसे किया जाता है? मूल्य मॉडल पर वापस कैसे बंधे हैं?

वर्तमान में मेरे पास प्रत्येक मान के लिए एक टेक्स्ट फ़ील्ड प्रदर्शित करने वाला एक फॉर्म है लेकिन उनके सभी का एक ही नाम और एक ही आईडी है। यह स्पष्ट रूप से मान्य HTML नहीं है और एमवीसी को मूल्यों को मैप करने से रोक देगा।

उत्तर

14

आप इसे संपादक टेम्पलेट का उपयोग करके करेंगे। इस तरह ढांचा सब कुछ का ख्याल रखेगा (पोस्ट फील्ड में मूल्यों को सही ढंग से बाध्य करने के लिए इनपुट फ़ील्ड्स को सही ढंग से नामित करने से)।

नियंत्रक:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // In the GET action populate your model somehow 
     // and render the form so that the user can edit it 
     var model = new SomeModel 
     { 
      SomeProp1 = "prop1", 
      SomeProp2 = "prop1", 
      MyData = new[] 
      { 
       new SomeValue { Id = 1, Value = 123 }, 
       new SomeValue { Id = 2, Value = 456 }, 
      } 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(SomeModel model) 
    { 
     // Here the model will be properly bound 
     // with the values that the user modified 
     // in the form so you could perform some action 
     return View(model); 
    } 
} 

देखें (~/Views/Home/Index.aspx):

<% using (Html.BeginForm()) { %> 

    Prop1: <%= Html.TextBoxFor(x => x.SomeProp1) %><br/> 
    Prop2: <%= Html.TextBoxFor(x => x.SomeProp2) %><br/> 
    <%= Html.EditorFor(x => x.MyData) %><br/> 
    <input type="submit" value="OK" /> 
<% } %> 

और अंत में संपादक टेम्पलेट (~/Views/Home/EditorTemplates/SomeValue.ascx) जो स्वचालित रूप से MyData संग्रह के प्रत्येक तत्व के लिए लागू किया जाएगा:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.SomeValue>" %> 
<div> 
    <%= Html.TextBoxFor(x => x.Id) %> 
    <%= Html.TextBoxFor(x => x.Value) %> 
</div> 
+0

हे, मुझे लगता है कि मैं इसे अभी पोस्ट नहीं करूंगा क्योंकि आपका जवाब पहले से ही बेहतर है :) मुझे नहीं पता था कि आप सूचियों को आसानी से बांध सकते हैं। एमवीसी 3 के लिए धन्यवाद – Buildstarted

+2

रेज़र का उपयोग करना बेहतर नहीं है? – arame3333

1

IList IEnumerable लागू करता है, ताकि आप तो जैसे अपने मॉडल को संशोधित कर सकते हैं:

public class SomeModel { 
    public string SomeProp1 { get; set; } 
    public string SomeProp2 { get; set; } 
    public IList<SomeValue> MyData { get; set; } 
} 

आप IModelBinder इंटरफ़ेस का उपयोग अपने विशिष्ट मॉडल के लिए एक बांधने की मशीन बनाने के लिए कर सकते हैं। ऐसा करने के कुछ तरीके हैं। आप मॉडल के लिए EditorFor cshtml बना सकते हैं जो आपके SomeValue सूची और आउटपुट उचित आईडी के माध्यम से लूप करेगा और क्या नहीं। फिर, आपके ModelBinder कार्यान्वयन में तब आप अपने आईडी के माध्यम से पढ़ेंगे और उन्हें उचित रूप से बांधेंगे। मैं थोड़ी देर में एक कामकाजी नमूना पोस्ट कर सकता हूं।

+0

जब फॉर्म सबमिट किया गया है, तो ViewEngin ई संग्रह में सही तत्वों को डेटा को बाध्य करने का ख्याल रखना? –

+0

आप जानते हैं कि वास्तव में अजीब क्या है ... मैं ** शपथ ले सकता था ** इस सवाल ने कुछ अलग पूछा ... मुझे लगता है कि मैं एक ही समय में दो प्रश्न पढ़ रहा था और गलत जवाब दिया ... मैं जा रहा हूँ मेरा उत्तर बदलें – Buildstarted