从强类型剃刀视图中收集数据

时间:2013-05-14 15:12:21

标签: c# asp.net-mvc-3 razor

这是我的第一个asp.net mvc应用程序。我正在使用mvc 3和razor来查看我的观点。我遇到问题的具体视图是强类型视图(至少我认为是这样)但它接受这种类型:

@model List<List<DataAccess.MCS_DocumentFields>[]>

我做了几个局部视图,因为主视图是非常自定义的,我需要为我的数据的不同部分提供许多不同的逻辑。我的部分视图也是强类型(再次我认为这是正确的)类型:

@model List<DataAccess.MCS_DocumentFields>[]

构建视图所需的一切都在:

@using (Html.BeginForm("ActionMethodName", "Forms", FormMethod.Post))
{
    <div id="drawForm">
        <table border="1">

Hhtml.BeginForm内部我使用来自控制器的所有数据构建表。现在提交:

<button type="submit">Submit</button>

我正在寻找获取数据的最佳方法,并在数据库中更新更改的内容。在我的控制器中我有这个方法:

[HttpPost]
        public ActionResult ActionMethodName(FormCollection collection)
        {
            var test = collection;
            List<MCS_Documents> model = DocumentsService.All().ToList();
            return View("Index", model);
        }

这样我可以找到我的数据,但它太复杂了,我甚至不确定我是怎么做到的。我尝试了其他方法,使用相同的方法,但接受视图接受的类型作为参数:

[HttpPost]
            public ActionResult ActionMethodName(List<List<DataAccess.MCS_DocumentFields>[]> collection)
            {

但是当我这样做时,这些集合具有空值。从我知道的时候,当我使用强类型视图时,我可以获得一些额外的优点,比如form.validation和数据绑定准备好更新等等......

那么在我的特定场景中,处理从表单提交的数据的最佳方法是什么?

P.S

这就是我渲染主视图的方式:

<table border="1">
            <colgroup>
            <col span="1" style="width: 10%;" />
            <col span="1" style="width: 40%;" />
            <col span="1" style="width: 25%;" />
            <col span="1" style="width: 25%;" />
            </colgroup>
            <tbody>
                @for (int i = 0; i < Model.Count(); i++)
                {
                    if (Model[i][0][0].ContentTypeId == 1)
                    {
                        @Html.Partial("_PartialHeader", Model[i])
                    }
                    else if (Model[i][0][0].ContentTypeId == 2)
                    {
                        @Html.Partial("_PartialDrawing", Model[i])
                    }
                    else if (Model[i][0][0].ContentTypeId == 3)
                    {
                        @Html.Partial("_PartialBody", Model[i])
                    }
                    else if (Model[i][0][0].ContentTypeId == 4)
                    {
                        @Html.Partial("_PartialFooter", Model[i])
                    }
                }
            </tbody>
        </table>
        <button type="submit">Save</button>

这是我的部分内容之一,只是为了展示我如何使用它们:

@model List<DataAccess.MCS_DocumentFields>[] 
        <tr>          
                @if (!string.IsNullOrEmpty(Model[0][0].FieldValue))
                { 
                    <td colspan="2">
                    @Html.DisplayFor(x => x[0][0].FieldValue)
                    </td>
                }
                else
                { 
                    <td colspan="2">
                    Sign in here
                    </td>
                }         

                @if (!string.IsNullOrEmpty(Model[1][0].FieldValue))
                { 
                    <td colspan="2">
                    @Html.DisplayFor(x => x[1][0].FieldValue)
                    </td>
                }
                else
                { 
                    <td colspan="2">
                    Sign in here
                    </td>
                }        

        </tr>

1 个答案:

答案 0 :(得分:2)

最后一个操作方法是正确的(采用强类型),但您的视图需要采用不同的结构。您需要确保每个集合(甚至是子集合)都已正确编入索引,否则模型绑定将失败

您的观点应如下所示(请注意使用for循环):

主要观点:

@model List<List<DataAccess.MCS_DocumentFields>[]>

@for (int i = 0; i < Model.Count; i++)
{
    @Html.RenderPartial("PartialName", Model[i])
}

然后在你的偏见中:

  @model List<DataAccess.MCS_DocumentFields>[]

  @for (int i = 0; i < Model.Count; i++)
  {
      //Not sure if you need anything at this level
      for (int j = 0; j < Model[i].Count(); j++)
      {
          //Add your EditorFor's, HiddenFor's etc for the child type
      }
  }