从表中读取数据并将其传递给asp.net mvc3中的控制器

Ler*_*ica 0 html javascript c# jquery asp.net-mvc-3

我知道这是非常标准的过程,但由于对表创建方式的一些自定义要求,我很难找到从表中读取数据并将其传递回控制器的方法.

我使用数据库中的记录构建我的表,每个记录包含rowNo和columnNo,问题是每个raw可能具有不同的列数.我找不到一个可以构建它的正确的插件,所以我做了一个简单的方法,创建一个我传递给视图的字符串.

只是想知道我在这里谈论的是代码中的一个片段,你可以看到我如何创建<td>..</td>:

sb.Append("<td>" + innerArray[a][0].QuestionText +
                                "<input type='textbox' value=" +
                                innerArray[a][0].FieldValue + "></td>");
Run Code Online (Sandbox Code Playgroud)

我知道使用StringBuilder不是很聪明,+但现在它可以工作.因此,在构建我的字符串并将其传递给视图后,我得到了这个:

在此输入图像描述

这是来源View page source:

 <tr>
     <td>alabala<input type='textbox' value=></td>
     <td colspan=2><input type='textbox' value=yes></td>
 </tr>
 <tr>
     <td colspan=3>alabala<input type='textbox' value=yes></td>
 </tr>
 <tr>
     <td colspan=3>alabala<input type='textbox' value=yes></td>
 </tr>
 <tr>
     <td>alabala<input type='textbox' value=no></td>
     <td>alabala<input type='textbox' value=no></td>
     <td>alabala<input type='textbox' value=no></td>
 </tr>
 <tr>
     <td>alabala<input type='textbox' value=no></td>
     <td colspan=2><input type='textbox' value=no></td>
 </tr>
 <tr>
     <td colspan=3>alabala<input type='textbox' value=></td>
 </tr>
 <tr>
     <td colspan=3>alabala<input type='textbox' value=no></td>
 </tr>
Run Code Online (Sandbox Code Playgroud)

这就是你如何看待它 - 一个包含整个HTML代码的长字符串.

所有文本框都是可编辑的,所以我需要的是一种读取每个文本框的数据并将其与RowNo和ColumnNo一起保存/传递的方法,以便我可以将其保存回我的数据库中.

Dar*_*rov 5

你为什么不使用视图模型?您在控制器操作中使用此字符串构建器所做的事情绝对违反了您在MVC设计模式中可能具有的所有良好实践.

因此,您可以一如既往地定义符合视图要求的视图模型:

public class ColViewModel
{
    public string RowNumber { get; set; }
    public string ColumnNumber { get; set; }
    public string QuestionText { get; set; }
    public string FieldValue { get; set; }
}

public class RowViewModel
{
    public List<ColViewModel> Columns { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

好的,现在让我们继续填充这个视图模型并将其传递给视图:

public ActionResult Index()
{
    // in your question you have shown something called innerArray, so I assume you
    // already retrieved this from your database or something:
    SomeDomainModel[,] innerArray = ...

    var model = new List<RowViewModel>();
    for (var row = 0; row < innerArray.GetUpperBound(0); row++)
    {
        var rowModel = new RowViewModel
        {
            Columns = new List<ColViewModel>()
        };
        for (var col = 0; col < innerArray.GetUpperBound(1); col++)
        {
            rowModel.Columns.Add(new ColViewModel
            {
                RowNumber = innerArray[row, col].RowNo,
                ColumnNumber = innerArray[row, col].ColumnNo,
                QuestionText = innerArray[row, col].Question,
                FieldValue = innerArray[row, col].FieldValue,
            });
        }
        model.Add(rowModel);
    }

    return View(model);
}

[HttpPost]
public ActionResult Index(List<RowViewModel> model)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

最后在相应的强类型视图中:

@model List<RowViewModel>
@using (Html.BeginForm())
{
    <table>
        @for (var i = 0; i < Model.Count; i++)
        {
            <tr>
                @for (var j = 0; j < Model[i].Columns.Count; j++)
                {
                    <td>
                        @Html.HiddenFor(x => x[i].Columns[j].RowNumber)
                        @Html.HiddenFor(x => x[i].Columns[j].ColumnNumber)
                        @Html.DisplayFor(x => x[i].Columns[j].QuestionText)
                        @Html.EditorFor(x => x[i].Columns[j].FieldValue)
                    </td>
                }
            </tr>
        }
    </table>

    <button type="submit">Save</button>
}
Run Code Online (Sandbox Code Playgroud)