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一起保存/传递的方法,以便我可以将其保存回我的数据库中.
你为什么不使用视图模型?您在控制器操作中使用此字符串构建器所做的事情绝对违反了您在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)