Как сохранить несколько моделей, отредактированных в форме в ASP.NET MVC? - PullRequest
1 голос
/ 10 февраля 2011

Мне нужно сделать вид, который будет поддерживать массовую вставку объектов.Я использую шаблон репозитория с Entity Framework 4.

Поскольку в представлении будет несколько отдельных моделей, как мне справиться с привязкой модели представления к тому, что get отправляется в репозиторий?

Как получить входные значения из формы в контроллер?


Мне удалось сделать представление, но я не могу получить данные из контроллера.Я использовал следующее заявление, но после поста оно становится nul

    public ActionResult AddPaymentForRoot_post(PaymentViewModelObject payments) {


        return null;

    }

1 Ответ

2 голосов
/ 10 февраля 2011

Я еще не использовал EF, но у меня есть аналогичное требование на нашем сайте.Я выполнил это, указав представление как наследующее System.Web.Mvc.ViewPage<IEnumerable<MyModelObject>>, а затем использовал цикл for для создания нескольких входных секций, используя соглашения об именах, необходимые для того, чтобы связыватель модели мог создать перечисляемое.

Я предпочитаю создавать представлениемодель со свойством, которое является перечислимым (см. обновление 2 ниже).В этом примере мы можем сказать, что это будет объект MyViewModel со свойством IEnumerable<MyModelObject> с именем MyModelObjects.В этом случае представление будет воспроизводиться следующим образом ...

В частности, убедитесь, что для каждого входного раздела включено скрытое поле с именем MyModelObjects.Index, а затем укажите входные данные вашего свойства с именем MyModelObjects[0].MyProperty, гдезначение скрытого поля Index соответствует индексу массива в именах свойств.

То, что вы в итоге получите, будет выглядеть так, например:

<div>
    <input type="hidden" name="MyModelObjects.Index" value="0" />
    Name: <input type="text" name="MyModelObjects[0].Name" /><br />
    Value: <input type="text" name="MyModelObjects[0].Value" />
</div>
<div>
    <input type="hidden" name="MyModelObjects.Index" value="1" />
    Name: <input type="text" name="MyModelObjects[1].Name" /><br />
    Value: <input type="text" name="MyModelObjects[1].Value" />
</div>
<div><a href="#" id="addItem">Add another item</a></div>

В некоторых случаяхУ меня также есть javascript (вызванный ссылкой привязки в разметке выше), который будет клонировать секцию ввода шаблона, изменить имена, чтобы заполнить значение индекса, и добавить его в DOM.Таким образом, пользователи могут динамически добавлять записи в представление.

В зависимости от того, как вы работаете с вашими моделями, вы также можете передать ViewModel со свойством IEnumerable.Типизирование для вида изменится, но принципиально дизайн представления не изменится.

ОБНОВЛЕНИЕ Используя приведенный выше пример, приведу краткий фрагмент кода jQuery, который я использую для добавления элементов.,Я предполагаю, что это вставка, но обратите внимание на комментарии, если вы хотите поддержать этот тип интерфейса для редактирования.

Сначала я настроил шаблон.Хотя это может быть полностью встроено в jQuery, я просто считаю, что проще делать разметку и манипулировать именами.

<div id="templateDiv" style="display: none;">
    <input type="hidden" name="MyModelObjects.Index" value="0T" />
    Name: <input type="text" name="MyModelObjects[0T].Name" /><br />
    Value: <input type="text" name="MyModelObjects[0T].Value" />
</div>

Вы также можете указать там идентификаторы ... возможно, это хорошая практика, но вДля краткости я оставлю это для примера.

С этим вы можете настроить функцию jQuery следующим образом:

var currentIndex = 1 // if you were using this for editing, this would be dynamically set to the number of items you have
var doAddItem =
    function() {
        currentIndex++;
        var newItem = $("#templateDiv").clone();
        newItem.attr("id", "item" + currentIndex); // reset the ID here
        newItem.find("input[name=MyModelObjects.Index]").val(currentIndex);
        newItem.find("input[name$=.Name]").attr("name", "MyModelObjects[" + currentIndex + "].Name");
        newItem.find("input[name$=.Value]").attr("name", "MyModelObjects[" + currentIndex + "].Value");
        newItem.insertBefore($(this).closest("div")); // insert it before the div containing the add link...adjust appropriate to your layout
        return false;
    }

$(document).ready(function() {
    $("#addItem").click(doAddItem);
    // In a real-world app you'd probably want to have a delete option, too
});

ОБНОВЛЕНИЕ 2 Естьтам немного ошибки - если ваше представление набрано на IEnumerable<object>, тогда ваши имена полей в конечном итоге будут просто Index и [0].Name / [0].Value.В моем реальном приложении я использую модель представления, которая имеет свойство, которое само по себе является перечисляемым, поэтому я на самом деле печатаю свои страницы как <MyViewModelObject>.В приведенном выше примере этот объект модели представления будет иметь свойство с именем MyModelObject, которое будет перечислимым (и более реалистично называемым MyModelObjects во множественном числе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...