2013-11-25 14 views
13

Tôi đang gặp sự cố khi ràng buộc một mô hình có chứa danh sách các đối tượng. Không có vấn đề gì khi tôi cố gắng truyền dữ liệu từ bộ điều khiển đến khung nhìn, nhưng khi tôi muốn gửi lại dữ liệu, tôi nhận được thông báo rằng phương thức không tồn tại.Mô hình ràng buộc mô hình MVC Danh sách các đối tượng

Tôi đang sử dụng cuộc gọi ajax và dữ liệu tôi đặt $ form.serialize() và có thể xem danh sách với tất cả dữ liệu trong chế độ không hoạt động, nhưng tôi không có may mắn với ràng buộc.

Model là:

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

Trong điều khiển của tôi phương pháp này cho bây giờ là:

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

Phương pháp này không được gọi, nhưng khi tôi loại bỏ các tham số công trình gọi. Vì vậy, tôi chắc chắn rằng các ràng buộc không hoạt động. Tôi đã có rất nhiều mô hình phức tạp hơn, nhưng tôi đã đơn giản hóa nó nhiều nhất có thể và vẫn không thể làm cho nó hoạt động được.

Vì vậy, câu hỏi của tôi là làm thế nào tôi có thể kiểm tra điều này để xem vấn đề là gì?

Edit:

Tôi không có mã vào lúc này, nhưng mã số đó là chức năng, vì tôi sử dụng nó ở những nơi khác trong dự án. Nó là một cái gì đó như thế này:

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

Hình thức trông giống như sau:

@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

Và cuộc gọi ajax của bạn ở đâu? – PSL

+0

Làm cách nào để xuất kết quả? Bạn có cơ hội sử dụng 'foreach' không? –

+0

Tôi đang sử dụng statment để chuyển tất cả các phần tử và thuộc tính của chúng từ danh sách main_model_list. – Aleks

Trả lời

1

Hãy thử như sau:

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

Tôi vẫn gặp sự cố tương tự. – Aleks

1

trong khi liên kết các chất kết dính được tìm kiếm Id giá trị mà không phải do bạn cung cấp. nên thêm này trong vòng lặp trong trang điểm của bạn

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

Tôi chắc chắn rằng bạn đã viết html sai, bạn muốn gửi một bộ sưu tập để điều khiển, nhưng dữ liệu mẫu của bạn không phù hợp với mô hình của bạn.

Tôi nghĩ rằng nếu bạn muốn gửi một bộ sưu tập để điều khiển của bạn, bạn phải thay đổi bạn html dạng như thế:

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

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

Và tôi nghĩ bạn nên xóa Danh sách dddl khỏi mô hình duy nhất.

1

Tôi đã thực hiện bên dưới mã đang hoạt động tốt.Khai Model (s) như sau

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

Và phương pháp hành động điều khiển như sau

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

Và Cuối cùng Xem nên một cái gì đó như thế này

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

}

Trên Tất cả đảm bảo tất cả các tập tin kịch bản được nạp và cũng Check this Link where Model binding will not work for Lable and LableFor

2

Bạn có thể cố gắng sử dụng

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

Đừng quên sử dụng jquery.unobtrusive-ajax.js

và với Ajax.BeginForm bạn có thể loại bỏ khối mã jQuery để gửi mẫu của bạn, và nó làm cho rằng hình thức của bạn được ràng buộc trực tiếp trong Hành động.

2

Bạn có thể thay đổi mã của mình.

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

Vì bạn không cung cấp tên thông số, mô hình mvc ràng buộc không hoạt động.

Các vấn đề liên quan