2013-11-25 18 views
13

Mam problem z powiązaniem modelu zawierającego listę obiektów. Nie ma problemów, gdy próbuję przekazać dane z kontrolera do widoku, ale kiedy chcę wysłać dane z powrotem, otrzymuję komunikat, że metoda nie istnieje.Binding Lista obiektów MVC obiektów

Używam wywołania ajax i jako dane umieszczam $ form.serialize() i widzę listę z wszystkimi danymi w skrzypku, ale nie mam szczęścia z powiązaniem.

modelu jest:

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;} 
} 

W moim kontrolera metoda jest teraz:

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

Ta metoda nie sprawdzony, ale kiedy usunąć parametr prace dzwoni. Więc jestem pewien, że wiązanie nie działa. Miałem dużo bardziej skomplikowany model, ale uprościłem go tak bardzo, jak tylko mogę i nadal nie mogłem go uruchomić.

Moje pytanie brzmi: jak mogę to sprawdzić, aby zobaczyć, jaki jest problem?

Edit:

nie mam kodu w tej chwili, ale że kod jest funkcjonalny, ponieważ używam go w innych miejscach w projekcie. Jest coś takiego:

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

Formularz wygląda mniej więcej tak:

@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

A gdzie jest twoje połączenie ajax? – PSL

+0

Jak wypisać widok? Czy przez przypadek używasz "foreach"? –

+0

Korzystam z for formentment przekazując wszystkie elementy i ich właściwości z listy main_model_list. – Aleks

Odpowiedz

1

Spróbuj wykonać następujące czynności:

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

Nadal mam ten sam problem. – Aleks

1

podczas wiązania spoiwa szuka wartość identyfikatora, który nie był dostarczone przez ciebie. więc dodać to w pętli na stronie widoku

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

Jestem pewien, że napisałeś html niesłusznie, chcesz umieścić kolekcję do kontrolera, ale dane postać nie pasuje do modelu.

Myślę, że jeśli chcesz wysłać kolekcję do kontrolera trzeba zmodyfikować html formularza tak:

<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> 

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

Myślę, że powinieneś usunąć List dddl z jednego modelu.

1

Wykonałem poniższy kod, który działa poprawnie.Deklarują Model (s) jak poniżej

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; } 
} 

i metody działania kontrolera są następujące

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"); 
    } 
} 

i wreszcie Zobacz powinno być coś takiego

@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> 

}

Przede wszystkim upewnij się, wszystkie pliki skryptów są ładowane, a także Check this Link where Model binding will not work for Lable and LableFor

2

Można spróbować użyć

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

Nie zapomnij użyć jquery.unobtrusive-ajax.js

iz Ajax.BeginForm można usunąć ten fragment kodu jQuery, aby wysłać formularz, a to sprawia, że ​​Twoja postać będzie wiązać bezpośrednio w Akcji.

2

Możesz zmienić swój kod.

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

Ponieważ nie podaje się nazwy parametru, powiązanie modelu mvc nie działa.

Powiązane problemy