2013-11-25 7 views
13

मुझे ऑब्जेक्ट्स की सूची वाले मॉडल को बाध्य करने में समस्या हो रही है। जब मैं नियंत्रक से डेटा को देखने के लिए डेटा को पास करने का प्रयास करता हूं तो कोई समस्या नहीं होती है, लेकिन जब मैं डेटा वापस भेजना चाहता हूं, तो मुझे एक संदेश मिलता है कि विधि मौजूद नहीं है।एमवीसी मॉडल बाध्यकारी वस्तुओं की सूची

मैं एक AJAX कॉल का उपयोग कर रहा हूं और डेटा के रूप में मैं $ form.serialize() डालता हूं और फिडलर में सभी डेटा के साथ सूची देख सकता हूं, लेकिन मुझे बाध्यकारी के साथ कोई भाग्य नहीं है।

मॉडल है:

public class Single 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public List<SimpleDropdown> dddl {get;set;} 
    public int SelectedEmp {get;set;} 
} 
public class MainModel 
{ 
    public List<Single> main_model_list {get;set;} 
} 

मेरी नियंत्रक में विधि अब के लिए है:

[HttpPost] 
public string SaveModel(MainModel model) 
{ 
    return ""; 
} 

इस विधि कहा जाता है नहीं होता है, लेकिन जब मैं पैरामीटर बुला काम करता है हटा दें। तो मुझे यकीन है कि बाध्यकारी काम नहीं करता है। मेरे पास बहुत अधिक जटिल मॉडल था, लेकिन मैंने इसे उतना सरल बना दिया जितना मैं कर सकता था और अभी भी इसे काम नहीं कर सका।

तो मेरा सवाल यह है कि मैं यह देखने के लिए कैसे परीक्षण कर सकता हूं कि समस्या क्या है?

संपादित करें:

मैं न इस समय कोड है, लेकिन है कि कोड कार्यात्मक है क्योंकि मैं इस परियोजना में अन्य स्थानों में इसका इस्तेमाल करते हैं।

$("#form").submit(function() { 
     $.ajax({ 
     url: "/Controller/SaveModel", 
     type: "POST", 
     data: $(this).serialize() 
    }); 
}); 

प्रपत्र इस तरह दिखता है:: यह कुछ इस तरह है

@using (Html.BeginForm("SaveModel", "Home", FormMethod.Post, new { id = "form" })) 
{ 
    @for (var z = 0; z < ViewBag.groupes.Length; z++) 
    { 
     <div style="border-left: 1px solid black"> 
      <h1>@ViewBag.groupes[z]</h1> 
     </div> 
    } 
    @for (var i = 0; i < Model.main_model_list.Count; i++) 
    { 
     <div>@Html.LabelFor(x => x.main_model_list[i].Id)</div> 
     <div>@Html.LabelFor(x => x.main_model_list[i].Name)</div> 
     <div style="float: left">@Html.DropDownListFor(x => main_model_list[i].SelectedEmp, new SelectList(main_model_list[i].dddl, "Id", "Value", main_model_list[i].SelectedEmp), new { @class = "preferences_dd_lists" })</div> 
    } 
} 
+3

और आपका AJAX कॉल कहां है? – PSL

+0

आप दृश्य को कैसे आउटपुट करते हैं? क्या आप मौके से 'फोरैच' का उपयोग कर रहे हैं? –

+0

मैं मुख्य तत्वों और उनके गुणों को main_model_list सूची से गुजरने वाली स्टेटमेंट का उपयोग कर रहा हूं। – Aleks

उत्तर

1

प्रयास करें निम्नलिखित:

$("#form").submit(function() { 
     $.ajax({ 
     url: "/Controller/SaveModel", 
     contentType: "application/json", 
     type: "POST", 
     data: $(this).serialize() 
    }); 
}); 
+0

मुझे अभी भी एक ही समस्या है। – Aleks

1

जबकि बंधन बांधने की मशीन मूल्य ईद की तलाश में है जो नहीं था आपके द्वारा प्रदान किया गया तो आपके विचार पेज में पाश में इस ऐड

@Html.HiddenFor(x => x.main_model_list[i].Id) 
1

मुझे यकीन है कि आप html लिखा हूँ गलत तरीके से, आप नियंत्रक करने के लिए एक संग्रह पोस्ट करना चाहते हैं, लेकिन अपने डेटा-प्रपत्र अपने मॉडल के साथ मेल नहीं खाता।

मुझे लगता है कि अगर आप अपने नियंत्रक करने के लिए एक संग्रह भेजना चाहते हैं आप ऐसा अपने html फार्म संशोधित करने के लिए है:

<input type="hidden" name="main_model_list[0].Id" value="1 /> 
<input type="hidden" name="main_model_list[0].Name" value="xyz" /> 
<select name="main_model_list[0].SelectedEmp"> 
..... 
</select> 
<input type="hidden" name="main_model_list[1].Id" value="1 /> 
<input type="hidden" name="main_model_list[1].Name" value="xyz" /> 
<select name="main_model_list[1].SelectedEmp> 
..... 
</select> 

............... ..

और मुझे लगता है कि आपको एकल मॉडल से सूची dddl को हटा देना चाहिए।

1

मैंने कोड के नीचे निष्पादित किया है यह ठीक काम कर रहा है।घोषित

public class SimpleDropdown 
{ 
    // 
    // Summary: 
    //  Gets or sets the text of the selected item. 
    // 
    // Returns: 
    //  The text. 
    public string Text { get; set; } 
    // 
    // Summary: 
    //  Gets or sets the value of the selected item. 
    // 
    // Returns: 
    //  The value. 
    public string Value { get; set; } 
} 

public class SingleEntity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<SimpleDropdown> dddl { get; set; } 
    public int SelectedEmp { get; set; } 
} 

public class MainModel 
{ 
    public List<SingleEntity> main_model_list { get; set; } 
} 

और नियंत्रक कार्रवाई तरीकों नीचे के रूप में मॉडल (रों) कर रहे हैं के रूप में

public class BasicController : Controller 
{ 
    public ActionResult GetModel() 
    { 
     MainModel mainModel = new MainModel(); 
     List<SimpleDropdown> dropdownlist = new List<SimpleDropdown>(); 
     List<SingleEntity> selist = new List<SingleEntity>(); 
     for (int j = 1; j < 10; j++) 
     { 
      dropdownlist.Add(new SimpleDropdown { Text = "Text" + j, Value = j.ToString() }); 

     } 
     SingleEntity se; 
     for (int i = 0; i < 10; i++) 
     { 
      se = new SingleEntity(); 
      se.Id = i; 
      se.Name = "Name" + i; 
      se.SelectedEmp = i; 
      se.dddl = dropdownlist; 
      mainModel.main_model_list = selist; 
      mainModel.main_model_list.Add(se); 

     } 
     return View(mainModel); 
    } 

    [HttpPost] 
    public ActionResult SaveModel(MainModel mainModelasdfafsf) 
    { 
     // do stuff here... please not only selectedEmp only will get reflected but not the property ddl since its again another list 
     return View("GetModel"); 
    } 
} 

इस प्रकार है और अंत में देखें इस

@model MvcDemo.Models.MainModel 
@using (Html.BeginForm("SaveModel", "Basic", FormMethod.Post, new { id = "formModel" })) 
की तरह कुछ किया जाना चाहिए

{

for (var i = 0; i < Model.main_model_list.Count; i++) 
{ 
<div>@Html.TextBoxFor(x => Model.main_model_list[i].Id)</div> 
<div>@Html.TextBoxFor(x => Model.main_model_list[i].Name)</div> 
<div> 
    @Html.TextBoxFor(x => Model.main_model_list[i].SelectedEmp) 
</div> 
<div style="float: left"> 
    @Html.DropDownListFor(x => Model.main_model_list[i].SelectedEmp, new SelectList(Model.main_model_list[i].dddl, "Text", "Value", Model.main_model_list[i].SelectedEmp), new { @class = "preferences_dd_lists" }) 

</div> 

} 

<input type="button" value="Save" id="btnsave" name="btnsave" /> 

}

@section Scripts{ 
<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#btnsave').click(function() { 
      $.ajax({ 
       async: false, 
       cache: false, 
       data: $('#formModel').serialize(), 
       url: '@Url.Action("SaveModel", "Basic")', 
       type: "POST", 
       dataType: "text/html", 
       success: function() { 
        alert('success'); 
       }, 
       error: function (errorThrown) { 
        debugger; 
        alert('something went wrong!!!'); 
       } 

      }); 
     }); 
    }); 
</script> 

}

सभी से ऊपर सुनिश्चित करें कि सभी स्क्रिप्ट फ़ाइलें लोड किए गए हैं बनाने के लिए और भी Check this Link where Model binding will not work for Lable and LableFor

2

आप उपयोग करने के लिए कोशिश कर सकते हैं

@using(Ajax.BeginForm("SaveModel", "controller", formMethod.Post, new AjaxOptions{ })) 
    { 
     // your form 
    } 

मत भूलना का उपयोग jquery.unobtrusive-ajax.js

और Ajax.BeginForm साथ आप jQuery कोड की है कि ब्लॉक को हटा सकते हैं आपके प्रपत्र भेजने के लिए, और यह है कि आपके प्रपत्र बाँध हो बनाता है सीधे कार्रवाई में।

2

आप अपना कोड बदल सकते हैं।

data:{ model:$(this).serialize()} 

क्योंकि आप पैरामीटर नाम नहीं देते हैं, तो एमवीसी मॉडल बाइंडिंग काम नहीं करती है।

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