2011-02-10 2 views
1

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

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

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


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

public ActionResult AddPaymentForRoot_post(PaymentViewModelObject payments) { 


     return null; 

    } 

ответ

2

Я не использовал EF еще, но у меня есть подобное требование на нашем сайте. Я выполнил его, указав View как наследующий 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. Впечатывание для представления изменилось бы, но в принципе дизайн представления не будет.

UPDATE Используя приведенный выше пример, вот краткий фрагмент кода 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 
}); 

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

+0

Вау, я не думал так раньше. это идеальная идея. Я не попробовал, но логика имеет смысл для меня и очень уверена, что это сработает. Не могли бы вы дать мне подсказку о коде jquery, чтобы клонировать раздел ввода шаблона? Большое спасибо, кстати. это значило для меня много. – tugberk

+0

Добавлен код. Имейте в виду, что ваш контроллер должен будет принять модель, и вам придется вставлять каждый элемент в коллекцию. –

Смежные вопросы