2013-11-25 7 views
13

У меня возникли проблемы с привязкой модели, содержащей список объектов. Нет проблем, когда я пытаюсь передать данные с контроллера на представление, но когда я хочу отправить данные обратно, я получаю сообщение о том, что метод не существует.MVC Model Binding Список объектов

Я использую вызов 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 ""; 
} 

Этот метод не дозвонились, но когда я удалить параметр вызывные работы. Поэтому я уверен, что привязка не работает. У меня была намного более сложная модель, но я упростил ее настолько, насколько могу, и до сих пор не мог заставить ее работать.

Так что мой вопрос: как я могу проверить это, чтобы узнать, в чем проблема?

Edit:

Я не имею код в данный момент, но этот код является функциональным, потому что я использую его в других местах в проекте. Это что-то вроде этого:

$("#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

И где ваш аякс-вызов? – PSL

+0

Как вы выводите представление? Вы случайно используете «foreach»? –

+0

Я использую элемент stat, передающий все элементы и их свойства из списка main_model_list. – Aleks

ответ

1

Попробуйте следующее:

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

У меня все еще такая же проблема. – Aleks

1

при связывании связующее ищет Id значение, которое не было предоставленный вами. так добавить это в петле на странице просмотра

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

И наконец View должно быть что-то вроде этого

@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()} 

Поскольку вы не указываете имя параметра, привязка модели mvc не работает.