ASP.Net MVC4 привязывает «создание представления» к модели, содержащей список

Здравствуйте, в интернете, у меня есть интересная головоломка для вас:

Можно ли связать представление для создания объекта, если этот объект содержит список других объектов, использующих только представления MVC / частичные представления?

Чувак, все вышло так сложно, как ... позвольте мне привести пример кода, который я имею в виду:

Models:
public class ComplexObject
{
    public string title { get; set; }
    public List contents { get; set; }
}

public class ContainedObject
{
    public string name { get; set; }
    public string data { get; set; }
}

Красиво и просто верно? Итак, строго типизированное представление для создания одного из них действительно просто длязаглавие" имущество:

something like:
@Html.TextBoxFor(x => x.title)

Но я могу'не могу найти хороший способ связать списокContainedObjects» используя MVC. Самым близким, что я получил, было создание строго типизированного IEnumerable частичного представления с "Список" Шаблон скаффолд и включить его на странице.

Без добавления стилей и т. Д. По умолчанию это частичное представление выглядит так:

@model IEnumerable

<p>
@Html.ActionLink("Create New", "Create")
</p>

    
        
            @Html.DisplayNameFor(model => model.name)
        
        
            @Html.DisplayNameFor(model => model.data)
        
        
    

@foreach (var item in Model) {
    
        
            @Html.DisplayFor(modelItem => item.name)
        
        
            @Html.DisplayFor(modelItem => item.data)
        
        
            @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
            @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
        
     
}


Но, честно говоря, я могуt выяснить, как включить это как привязку к созданию нового ComplexObject. Другими словами, я могу показать список уже существующих объектов ContainedObject, связавшись так: @ Html.Partial ("PartialCreate», Model.contents)

Но то, что я действительно хочу, я думаю, это что-то вроде:

@Html.PartialFor("PartialCreate", x => x.contents)

Я должен отметить, что я неу меня не так уж много проблем с кодированием вокруг этого с помощью Javascript (явключу код ниже) но яочень хотел бы знать, если естьЭто способ сделать это исключительно с MVC. Я'м недавно конвертировать из WebForms (где яВо всяком случае, я просто заменил все мои постбэки вызовами AJAX), и подобные вещи часто встречаются в проектах, над которыми я работаю.

Во всяком случае, здесьКак я сейчас это делаю:

HTML -

Name: 
Data: 
<a id="addItem">Add Item</a>




<a id="saveAll">Save Complex Object</a>

Javascript -


var contents = [];
$(document).ready(function () {

    $('#addItem').click(function () {
        var newItem = { name: $('#enterName').val(), data: $('#enterData').val() };
        contents.push(newItem);
        $('#addedItems').html('');
        for (var i = 0; i < contents.length; i++) {
            $('#addedItems').append(
                "" + contents[i].name + ", " + contents[i].data + ""
            );
        }
    });

    $('#saveAll').click(function () {

        var toPost = { title: "someTitle", contents: contents };

        $.ajax({
                url: '/Home/SaveNew',
                type: 'POST',
                data: JSON.stringify(toPost),
                dataType: 'json',
                contentType: 'application/json; charset=utf-8',
                success: function (data, textStatus, jqXHR) {
                    alert("win");
                },
                error: function (objAJAXRequest, strError) {
                    alert("fail");
                }
            });
    });

});

И этоне страшное решение или что-то, я просто неЯ не хочу реализовывать вызовы Javascript каждый раз, когда я хочу сохранить новый объект, но везде использую стандартный код Razr. Я'Я хотел бы быть достаточно последовательным по всем направлениям.

Кто-нибудь еще сталкивался с этой проблемой и нашел решение?

 Maess19 окт. 2012 г., 17:21
Почему бы не сериализовать форму в вашем посте Ajax?
 Maess19 окт. 2012 г., 17:43
Если вы нене хочу публиковать форму, нетЭто чисто бритвенный способ сделать это. Вы можете опубликовать для с AJAX от бритвы, но это потребует формы. В противном случае ваше решение в порядке.
 Sébastien Richer13 мар. 2013 г., 18:23
Фрэнки, яЯ сталкиваюсь именно с этой ситуацией, и люди продолжают посылать меня на тот же 4-летний пост mvc 2, который говорит о чем-то "близко"... я разместил свой вопрос здесьstackoverflow.com/questions/15373158/... если вы найдете решение, ябудет очень интересно!
 FrankieAvocado19 окт. 2012 г., 17:29
я не уверен, если яСледую за вами здесь @Maess, AJAX-часть отлично работает здесь, так как я неу меня нет формыМне не нужно сериализовать его, я просто создаю объект JSON и отправляю его в мой контроллер / действие. Что я'm ищет способ сделать это чисто с помощью синтаксиса Razor и привязки объекта.
 Maess19 окт. 2012 г., 15:21
Почему нетВы используете форму?
 FrankieAvocado19 окт. 2012 г., 16:25
Я нене нужен один для подхода Javascript, так как он неникогдаОтправить".

Ответы на вопрос(2)

Решение Вопроса

что мне нужно выполнить ту же задачу и, как и вы, не хочу добавлять кучу javascript. Я'я использую MVC4 и, насколько я могу судить,Похоже, это готовый способ привязки перечисляемых свойств модели к представлению. :(

Однако, как вы продемонстрировали в своем вопросе,это возможно чтобы получить перечисляемые свойства из модели в представлении. Хитрость в том, чтобы просто получать обновления обратно в контроллер. Если исходить из ваших примеров моделей, ваш взгляд может выглядеть следующим образом (вы ненужно сделать частичное):

@model MVCComplexObjects.Models.ComplexObject

<p>
@Html.ActionLink("Create New", "Create")
</p>

@using (Html.BeginForm("SaveNew", "Home", FormMethod.Post))
{
    

        @for (int i = 0; i < Model.contents.Count; i++)
        {
             
        }

    <table>

        <tbody><tr>
            <th>
                @Html.DisplayNameFor(model => model.contents[0].name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.contents[0].data)
            </th>
            <th></th>
        </tr><tr>
                <td>
                    @Html.TextBox("updatedContents["+i+"].name", Model.contents[i].name)
                </td>
                <td>
                    @Html.TextBox("updatedContents["+i+"].data", Model.contents[i].data)
                </td>
                <td>
                    @* Got rid of the edit and detail links here because this form can now act as both *@
                    @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
                </td>
            </tr></tbody></table>

    <input type="submit" value="Save">
}

И действие вашего контроллера будет выглядеть так:

[HttpPost]
public ActionResult SaveNew(ICollection<containedobject> updatedContents)
{
    foreach (var co in updatedContents)
    {
        //Update the contained object...
    }

    return RedirectToAction("Index");
}
</containedobject>

По сути, мы определяем новый объект коллекции в представлении, которое MVC передает в ваш метод действия после отправки формы. Новый объект ("updatedContents» в этом примере) в основном совпадает со свойством list ("содержание»(в этом примере), который был определен и заполнен в модели ComplexObject.

Это немного больше работы, но она решает проблему отсутствия необходимости в JavaScript для поста обратно. Все можно сделать с помощью стандартного MVC.

 FrankieAvocado28 июл. 2014 г., 17:49
Это супер хитрый способ сделать это ... и мне это нравится.

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

Тогда прочитайте это:

http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

Статьи для MVC2, но будут работать в 3 и 4.

 FrankieAvocado19 окт. 2012 г., 16:23
Вторая статья была более полезной, чем первая, но на самом деле я тожеищу Первая статья была посвящена тому, как представить список статического размера, а не произвольного размера. Во второй статье описывалось, как редактировать список элементов, но не как создавать новый объект, который содержал список элементов переменного размера. Тем не менее, я вижу, как я смогу взломать шаблон для создания динамического списка ввода для отправки. Я'сейчас я голосую, но я нене думаю, что это настоящий "решение" к проблеме.

Ваш ответ на вопрос