1

看过Phil Haacks关于书籍的项目

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

这很有用,但我有多种数据类型。

我使用模型视图,以便我可以混合对象,在这种情况下:订单(即 order.id、order.date 等)、客户、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();
            }
        }
4

2 回答 2

1

我认为您应该致力于开发一个视图模型,以反映您需要返回的数据并为该模型创建显示/编辑模板,该模型使用 Phil Haack 的方法为您的对象列表呈现视图模型 - 在这种情况下,数组子模型类。让模型绑定框架为您的操作构建返回的模型(作为参数),然后从视图模型数据重构您的域模型。Brad Wilson 有一系列关于模板的优秀文章,应该会有所帮助。

于 2010-05-30T14:33:09.057 回答
0

我在复杂的类上使用 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)**

现在我不在视图中使用编辑器模板,因此要让您的列表出现在 formcollection 中,您必须在视图中添加类似这样的内容:

 @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 后控制器方法中的第一行代码之前接管。然后我遍历实际的 formcollection 并使用正则表达式去除 [#],因为您的 formcollection 将显示您的列表项,如下所示: Answers[0].Answer, Answers[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.
于 2014-04-24T14:58:53.253 回答