2013-03-26 10 views
6

में नियंत्रण और जमा करने वाले फॉर्म (HTML.BeginForm) के साथ प्रत्येक लूप के लिए मेरे दृश्य मॉडल में, मेरे पास ऑब्जेक्ट्स की एक सूची है। मैं इन वस्तुओं को पुन: सक्रिय करता हूं, और उनमें से प्रत्येक के लिए नियंत्रण बनाते हैं। नीचे की स्थिति में, मैं लोगों को एक टेक्स्टबॉक्स और प्रत्येक ऑब्जेक्ट के लिए एक बटन दिखाना चाहता हूं। जब उपयोगकर्ता बटन पर क्लिक करता है, तो एक पोस्ट बनाई जाती है, और मैं डेटा को अपने नियंत्रक में सहेज सकता हूं।एमवीसी 4

यूआई में, कोई उपयोगकर्ता अपना इच्छित फॉर्म बदल सकता है, और सहेजें पर क्लिक कर सकता है।

मेरे समस्या मॉडल रिक्त है जब यह नियंत्रक पोस्ट हो जाता है है ..

मेरे उस्तरा कोड:

 using (Html.BeginForm()) 
     { 
      foreach (var contributor in Model.Contributor) 
      { 

     @Html.HiddenFor(model => contributor.Id) 

     <div class="formrow"> 
      @Html.ValidationSummary(true) 
     </div> 

     <h2>@Html.TextRaw("AuthorInfo", "Author")</h2> 
     <div class="formrow"> 

      @Html.EditorFor(model => contributor.FirstName) 
      <div class="formvalidation"> 
       @Html.ValidationMessageFor(model => contributor.FirstName) 
      </div> 
     </div> 


     <div class="formrow right"> 
      <input type="hidden" name="formsubmitted" value="true" /> 
      <input type="submit" class="button" value="@Html.Text("ButtonText", "Save")" /> 
     </div> 
      } 
     } 

मेरा विचार मॉडल कोड

public class ProfileModel 
{ 
    public string Message { get; set; } 
    public List<PublisherModel> Publisher { get; set; } 
    public List<ContributorModel> Contributor { get; set; } 

    public ContributorModel NewContributor { get; set; } 
} 

मेरा नियंत्रक कोड

[HttpPost] 
public ActionResult Mine(ProfileModel model, string newuser) 
{ 
    // 
} 

इसे कैसे ठीक करें?

मुझे लगता है कि मुझे कुछ दृश्यों में बदलावों को संग्रहीत करने के तरीके के साथ अपने व्यू मॉडल का विस्तार करना होगा। लेकिन मैं वास्तव में कैसे नहीं देख सकता।

अभी नियंत्रक तक पहुंचने पर प्रोफ़ाइल मॉडल में सभी गुण शून्य हैं।

कोई विचार?

+0

आप पोस्ट करता है, तो स्ट्रिंग संदेश में अच्छी तरह से यह अभी भी रिक्त है? –

+0

क्या आप अपना एचटीएमएल '@ एचटीएमएल.एडिटरफॉर (मॉडल => योगदानकर्ता। फर्स्टनाम) के लिए प्रस्तुत कर सकते हैं। –

+0

सोमेथिंग्स ठीक नहीं दिखते हैं, दृश्य में मॉडल योगदानकर्ता मॉडल की सूची है, फिर भी मॉडल पोस्ट किया जा रहा है (एचटीपीपोस्ट) ProfileModel? यह आपके संपादन/देखने के समान मॉडल प्रकार नहीं है! – Zeddy

उत्तर

14

असल में समस्या यह है कि डिफ़ॉल्ट मॉडल बाइंडर फ़ोरैच लूप में संग्रह आइटम को सही ढंग से बाध्य करने में असमर्थ है। दूसरे शब्दों में, यह तत्व को गलत तरीके से नामित करता है और यही कारण है कि संग्रह पैरामीटर में शून्य के रूप में प्रदर्शित होता है।

मुझे यकीन है कि सभी प्रकार के विभिन्न कामकाज, सहायक और सामान हैं लेकिन मैं उनसे परिचित नहीं हूं, इसलिए मैं सिर्फ foreach के बजाय लूप के लिए उपयोग करता हूं, इस तरह तत्वों को सही तरीके से नामित किया जाता है।

इस प्रयास करें:

@for (int i = 0; i < Model.Contributor.Count(); i++) 
    { 

     @Html.HiddenFor(model => Model.Contributor[i].Id) 

     <div class="formrow"> 
      @Html.ValidationSummary(true) 
     </div> 

     <h2>@Html.TextRaw("AuthorInfo", "Author")</h2> 
     <div class="formrow"> 

      @Html.EditorFor(model => Model.Contributor[i].FirstName) 
      <div class="formvalidation"> 
       @Html.ValidationMessageFor(model => Model.Contributor[i].FirstName) 
      </div> 
     </div> 


     <div class="formrow right"> 
      <input type="hidden" name="formsubmitted" value="true" /> 
      <input type="submit" class="button" value="@Html.Text("ButtonText", "Save")" /> 
     </div> 
    } 

मैं सुझाव है कि आप एक डीबगिंग उपकरण का उपयोग करने देखने के लिए अगर तत्वों सही नाम विशेषता है, तो आपके मामले में वे योगदानकर्ता की तरह दिखना चाहिए [0] .id, योगदानकर्ता [0]। फर्स्टनाम आदि

+1

मैंने हाल ही में ऐसा कुछ किया है; मॉडल बाइंडर किसी सूची में बाध्य नहीं हो सकता है अगर यह प्रत्येक ऑब्जेक्ट के लिए इंडेक्स नहीं देख सकता है, इसलिए 'योगदानकर्ता [i] 'की आवश्यकता है। यदि आपको लूप पसंद नहीं है, तो 'foreach (कुछ कोलेक्शन में चयन करें) ((x, i) => नया {वैल्यू = एक्स, इंडेक्स = i}))' जो आपको 'चीज़ देगा। इंडेक्स 'लूप में इंडेक्स के रूप में (' लूप में 'i' के स्थान पर) और' thing.Value' ऑब्जेक्ट के रूप में। – anaximander

+0

मैंने उस समाधान के बारे में सोचा नहीं होगा .. बहुत बहुत धन्यवाद! वास्तव में मदद करता है :-) –

+0

मजाकिया बात यह है कि विजुअल स्टूडियो मुझे फोर-लूप को फोरच-लूप में बदलने के लिए सुझाव देता है और फिर कोड काम करना बंद कर देता है क्योंकि डेटा पोस्ट होने के बाद सही ढंग से बाध्य नहीं होता है – Dario

5

आप Contributor ऑब्जेक्ट के लिए पार्टियल व्यू का उपयोग कर सकते हैं। PartialView:

@model Contributor 
using (Html.BeginForm("ContributorUpdate", "YourController")) 
{ 
    @Html.HiddenFor(model => Model.Id) 
    <div class="formrow"> 
    @Html.ValidationSummary(true) 
    </div> 

    <h2>@Html.TextRaw("AuthorInfo", "Author")</h2> 
    <div class="formrow"> 

    @Html.EditorFor(model => Model.FirstName) 
    <div class="formvalidation"> 
     @Html.ValidationMessageFor(model => Model.FirstName) 
    </div> 
</div> 
<div class="formrow right"> 
    <input type="hidden" name="formsubmitted" value="true" /> 
    <input type="submit" class="button" value="@Html.Text("ButtonText", "Save")" /> 
</div> 
} 

देखें होगा:

@foreach (var contributor in Model.Contributor) 
{ 
    @{Html.RenderPartial("Conributor", contributor);} 
} 

और नियंत्रक कोड:

[HttpPost] 
public ActionResult Mine(Conributor conributor, string newuser) 
{ 
    // 
}