Для извлечения элементов [] из коллекции форм - mvc - следует использовать icollection, но смешивать типы - PullRequest
1 голос
/ 30 мая 2010

посмотрели на проект Фила Хаака по книгам на

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

, что было полезно, но у меня есть смесь типов данных.

Я использую представление модели, чтобы у меня была смесь объектов, в данном случае: Order (т.е. order.id, order.date и т. Д.), Customer, SoilSamplingOrder и список SoilSamplingSubJobs, который выглядит следующим образом [0]. id, [0] .field, [1] .id, [1] .field и т. д. Возможно, мне следует использовать ICollection вместо List? У меня были проблемы с получением UpdateModel, поэтому я использовал метод извлечения из коллекции. первые 4 вызова метода: orderRepository.FindOrder (id); и т.д. дайте модели оригинал для редактирования. но после этого я немного теряюсь в том, как обновить подзадачи. Надеюсь, я достаточно очерчен, чтобы разобраться в проблеме.

 [HttpPost]
        public ActionResult Edit(int id, FormCollection collection)
        {

            Order order = orderRepository.FindOrder(id);
            Customer cust = orderRepository.FindCustomer(order.customer_id);
            IList<SoilSamplingSubJob> sssj = orderRepository.FindSubOrders(id); 
            SoilSamplingOrder sso = orderRepository.FindSoilSampleOrder(id);

            try
            {

                UpdateModel(order, collection.ToValueProvider());

                UpdateModel(cust, collection.ToValueProvider());

                UpdateModel(sso, collection.ToValueProvider());



                IList<SoilSamplingSubJob> sssjs = orderRepository.extractSSSJ(collection);

                foreach (var sj in sssjs)
                    UpdateModel(sso, collection.ToValueProvider());


                orderRepository.Save();

                return RedirectToAction("Details", new { id=order.order_id});

            }
            catch
            {
                return View();
            }
        }

Ответы [ 2 ]

1 голос
/ 30 мая 2010

Я думаю, вам следует поработать над созданием модели представления, которая отражает данные, которые вам необходимы для возврата, и создать шаблоны отображения / редактирования для этой модели, которые визуализируют модель представления с использованием методов Фила Хаака для ваших списков объектов - в этом случай, массивы классов подмоделей. Позвольте структуре привязки модели построить возвращенную модель (в качестве параметра) для вашего действия, затем воссоздайте ваши модели предметной области из данных модели представления. У Брэда Уилсона есть отличная серия статей по шаблонам, которые должны быть полезны.

0 голосов
/ 24 апреля 2014

Я использую IModelBinder на моих сложных классах. Вам не нужен IModelBinder, но он сделает ваш пост-кодовый блок контроллера более чистым. Я сейчас использую VB, но мой класс выглядит примерно так:

 Public Class CombinedRulesAndXmlRules : Implements IModelBinder
    Public Rules As New Rules()
    Public XmlRules As New XmlRules()
    Public RequiredTemplates As New List(Of RequiredTemplates)
    Public SearchCriteria As New List(Of SearchCriteriaList)
    Public OptionalTemplates As New List(Of OptionalTemplates)
    Public Questions As New List(Of Questions)
    Public QATemplates As New List(Of QATemplates)
    **Public Answers As New List(Of Answers)**

Теперь я не использую шаблоны редактора в своих представлениях, поэтому, чтобы ваши списки появлялись в коллекции форм, вы должны добавить что-то вроде этого в ваше представление:

 @For x As Integer = 0 To Model.Answers.Count - 1
            Dim incr As Integer = x
        @Html.HiddenFor(Function(model) model.Answers(incr).Answer)
        @Html.HiddenFor(Function(model) model.Answers(incr).AnswerId)
        @Html.HiddenFor(Function(model) model.Answers(incr).AnswerTemplateTag)
        @Html.HiddenFor(Function(model) model.Answers(incr).Tag)
    Next

Когда представление отправлено / опубликовано, механизм связывания модели вступает во владение, прежде чем нажать на первую строку кода в методе пост-контроллера mvc. Затем я перебираю фактическую коллекцию форм и удаляю [#] с помощью регулярных выражений, потому что ваша коллекция форм будет отображать элементы вашего списка следующим образом: Ответы [0]. Ответ, Ответы [0] AnswerId и т.

 For x As Integer = 1 To request.Form.Count - 1
                keyname = request.Form.Keys(x)
                Debug.Write(keyname)

                val = request.Form(x).ToString()

                'If keyname contains [#] strip it. it's a list item.
                Dim pattern As String = "\[(\d+)\]"
                Dim iterpattern As String = "\d+"
                Dim rgx As New Regex(pattern)
                Dim rgxiter As New Regex(iterpattern)

                If Regex.IsMatch(keyname, pattern) Then
                    Dim match As Match = rgxiter.Match(keyname)
                    ListIteration = CInt(match.Value)
                    Dim result As String = rgx.Replace(keyname, "")
                    keyname = result
                End If

Следующий кодовый блок Select Case. Итак, вы уже знаете, что у вас есть строго типизированный класс в вашей модели, поэтому ваш выбор может выглядеть так:

Select Case keyname

                    Case "Answers.Answer"
                        'add code here to add to your return list. What you
                        'get in the post controller is a fully populated class.
...