从强类型的 Razor 视图中收集数据

3

这是我第一次使用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">

Html.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)
            {

但是当我这样做时,集合的值为null。据我所知,当我使用强类型视图时,我可以获得一些额外的优势,比如表单验证和数据绑定准备更新等等...所以,在我的特定场景下,如何处理来自表单提交的数据是最好的方法呢?
附言
以下是我如何渲染主视图:
<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
请展示如何从您的模型中呈现数据(必须有某种循环) - Jan
@Jan 请查看已编辑的原始帖子。 - Leron
1个回答

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
      }
  }

哇,你还没看到我的更新。你可以在我的原始帖子中看到我添加的代码。关于我如何使用模型的方式,你说得对,但是你可以看到我已经将Model[i]传递给了@Html.Partial,但在我的控制器中仍然得到了空值。你认为这是为什么呢? - Leron
@Leron,你实际上没有任何字段来保存要发送回服务器的数据?你只有DisplayFor,它不会被提交。尝试添加一个HiddenFor,看看是否有任何区别。 - Mathew Thompson
实际上我有3个字段 :) 但现在必须离开。明天会接受你的答案并添加一些HiddenFor以获取更多信息。谢谢。 - Leron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接