it-roy-ru.com

MVC Model Binding Список объектов

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

Я использую вызов ajax и в качестве данных я помещаю $ form.serialize () и вижу список со всеми данными в fiddler, но мне не повезло с привязкой.

Модель это:

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>
    }
}
13
Aleks

Вы можете изменить свой код.

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

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

2
Justin

Вы можете попробовать использовать 

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

Не забудьте использовать jquery.unobtrusive-ajax.js

а с помощью Ajax.BeginForm вы можете удалить этот блок кода jQuery для отправки вашей формы, и это позволяет связывать вашу форму непосредственно в Action.

2
Rodrigo de Farias

Я выполнил код ниже, он работает нормально. Объявите модель (ы) как ниже

 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>

}

Прежде всего, убедитесь, что все файлы сценариев загружены, а также Проверьте эту ссылку, где привязка модели не будет работать для Lable и LableFor

1
Gowtham.K.Reddy

Я уверен, что вы написали html неправильно, вы хотите опубликовать коллекцию на контроллере, но ваша форма данных не соответствует вашей модели.

Я думаю, что если вы хотите отправить коллекцию вашему контроллеру, вам нужно изменить html-form вот так:

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

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

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

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

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