c# - 从表中读取数据并将其传递给asp.net mvc3中的 Controller

标签 c# javascript jquery html asp.net-mvc-3

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

我使用数据库中的记录构建表,每个记录保存 rowNo 和 columnNo,问题是每个原始数据可能有不同数量的列。我找不到可以构建这个的合适插件,所以我做了一个简单的方法来创建一个传递给 View 的字符串。

为了了解我在这里所说的内容,请参阅代码片段,您可以在其中看到我如何创建 <td>..</td> :

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

我知道使用 StringBuilder 和 + 不是很聪明但目前它有效。然而,在构建我的字符串并将其传递给 View 之后,我得到了这个:

enter image description here

这是来自 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>

这就是您所看到的 - 一个包含整个 HTML 代码的长字符串。

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

最佳答案

为什么不使用 View 模型?您在 Controller 操作中使用此字符串生成器所做的事情绝对违背了您在 MVC 设计模式中可能拥有的所有良好实践。

因此,与往常一样,您可以从定义满足 View 要求的 View 模型开始:

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

好吧,现在让我们继续填充此 View 模型并将其传递给 View :

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

最后在相应的强类型 View 中:

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

关于c# - 从表中读取数据并将其传递给asp.net mvc3中的 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16207988/

相关文章:

javascript if() 不起作用

c# - 如何在代码隐藏中从 Application.Resources 访问命名资源?

c# - 如何确定类型是否是 Action/Func 委托(delegate)之一?

c# - 分组 ListView 中的项目不更改组

javascript将输入与数组实时搜索进行比较

javascript - "matches x and remembers the match"在正则表达式中意味着什么

javascript - 有没有办法使用 CSS 或 javascript 从另一个 CSS 样式引用现有的 CSS 样式?

c# - 从具有多个条件的数据表中选择

php - 加载前页面上出现 Stray "-->"

javascript - Bootstrap 弹出窗口在表格中悬停几次后停止