如何将 List<Tuple> 从 Table 传递给 Controller?
How to pass List<Tuple> from Table to Controller?
我在 C# 中使用 EF Core 1.2 编写了此代码,其中我有一个包含两个提交按钮的表单。第一个按钮 'upload' 调用我的方法 'UpLoadMyFile' 比较
从我的文本区域到一个模式的每一行和 returns 一个字符串,它告诉我它是否匹配一个模式。
然后我将所有文本及其状态添加到
List <Tuple<string, string>>
我通过 ViewModel 传递给我的视图,并在 table.
中显示每一行及其状态
现在我尝试在单击第二个按钮时将每一行保存到我的数据库中 'save'。但是每次我尝试保存我的行时都会发生 NullReferenceException
这告诉我 table 中的列表为空。
我想知道如何将所有行和状态从我的 Table 'MyTupleList' 传递到我的 Post 方法,因为我真的不知道如何解决我的问题。
我的看法:
@model Models.ViewModels.CreateSaetzeModelView
<form asp-action="ProcessCreateLines" asp-controller="SoftwareService" method="post" enctype="multipart/form-data">
<div class="div-marginBottom">
<table class="table">
<tbody>
<tr>
<td>
<textarea name="ExpressionTextarea" id="ExpressionTextarea" runat="server" TextMode="MultiLine" asp-for="@Model.LoadExpressions"></textarea>
<div class="col-md-10">
<input type="submit" name="upload" value="upload" /> !--Calls 'uploadmyfile' action-->
</div>
</td>
<td></td>
</tr>
</tbody>
</table>
</div>
<br />
<div class="div-ExpressionEingabe">
</div>
@if (Model.MyLinesList != null)
{
<div class="div-marginBottom">
<table id="MyTupleList" class="table table_align">
<thead>
<tr>
<th>
State
</th>
<th>
MyLines
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.MyLinesList)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Item2)
</td>
<td>
@Html.DisplayFor(modelItem => item.Item1)
</tr>
}
</tbody>
</table>
<input type="submit" name="save" value="save" />
</div>
}
我的代码:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ProcessCreateLines(string upload, string save, CreateLinesModelView cmv)
{
//Button 'upload': Checking my lines
if (!string.IsNullOrEmpty(upload))
{
string expressions = Request.Form["ExpressionTextarea"].ToString();
List<Tuple<string, string>> result = new FileUploadController().CheckExpressions(expressions);
cmv.MyLinesList = result;
return View("ProcessCreateLines", cmv);
}
//Button 'save': Saving my lines into a Database
if (!string.IsNullOrEmpty(save))
{
// ****************************MyLinesList is null*******************
var list = cmv.MyLinesList;
...saving my list into database...
}
}
感谢@StephenMuecke 的评论,我使用自制的 Tupel 代替了 Tupel class
public class MyListModel
{
public string myLine { get; set; }
public string myState { get; set; }
}
}
并在我的 ViewModel 中用它创建一个列表
public List<MyListModel> LineWithState { get; set; }
同样在我看来,我用 for 循环替换了 foreach 循环
@for (int i = 0; i < Model.LineWithState.Count; i++)
{
<tr>
<td>
@Html.TextBoxFor(m=>m.LineWithState[i].myState)
</td>
<td>
@Html.TextBoxFor(m=>m.LineWithState[i].myLine)
</tr>
}
我在 C# 中使用 EF Core 1.2 编写了此代码,其中我有一个包含两个提交按钮的表单。第一个按钮 'upload' 调用我的方法 'UpLoadMyFile' 比较 从我的文本区域到一个模式的每一行和 returns 一个字符串,它告诉我它是否匹配一个模式。 然后我将所有文本及其状态添加到
List <Tuple<string, string>>
我通过 ViewModel 传递给我的视图,并在 table.
中显示每一行及其状态现在我尝试在单击第二个按钮时将每一行保存到我的数据库中 'save'。但是每次我尝试保存我的行时都会发生 NullReferenceException 这告诉我 table 中的列表为空。
我想知道如何将所有行和状态从我的 Table 'MyTupleList' 传递到我的 Post 方法,因为我真的不知道如何解决我的问题。
我的看法:
@model Models.ViewModels.CreateSaetzeModelView
<form asp-action="ProcessCreateLines" asp-controller="SoftwareService" method="post" enctype="multipart/form-data">
<div class="div-marginBottom">
<table class="table">
<tbody>
<tr>
<td>
<textarea name="ExpressionTextarea" id="ExpressionTextarea" runat="server" TextMode="MultiLine" asp-for="@Model.LoadExpressions"></textarea>
<div class="col-md-10">
<input type="submit" name="upload" value="upload" /> !--Calls 'uploadmyfile' action-->
</div>
</td>
<td></td>
</tr>
</tbody>
</table>
</div>
<br />
<div class="div-ExpressionEingabe">
</div>
@if (Model.MyLinesList != null)
{
<div class="div-marginBottom">
<table id="MyTupleList" class="table table_align">
<thead>
<tr>
<th>
State
</th>
<th>
MyLines
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.MyLinesList)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Item2)
</td>
<td>
@Html.DisplayFor(modelItem => item.Item1)
</tr>
}
</tbody>
</table>
<input type="submit" name="save" value="save" />
</div>
}
我的代码:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ProcessCreateLines(string upload, string save, CreateLinesModelView cmv)
{
//Button 'upload': Checking my lines
if (!string.IsNullOrEmpty(upload))
{
string expressions = Request.Form["ExpressionTextarea"].ToString();
List<Tuple<string, string>> result = new FileUploadController().CheckExpressions(expressions);
cmv.MyLinesList = result;
return View("ProcessCreateLines", cmv);
}
//Button 'save': Saving my lines into a Database
if (!string.IsNullOrEmpty(save))
{
// ****************************MyLinesList is null*******************
var list = cmv.MyLinesList;
...saving my list into database...
}
}
感谢@StephenMuecke 的评论,我使用自制的 Tupel 代替了 Tupel class
public class MyListModel
{
public string myLine { get; set; }
public string myState { get; set; }
}
}
并在我的 ViewModel 中用它创建一个列表
public List<MyListModel> LineWithState { get; set; }
同样在我看来,我用 for 循环替换了 foreach 循环
@for (int i = 0; i < Model.LineWithState.Count; i++)
{
<tr>
<td>
@Html.TextBoxFor(m=>m.LineWithState[i].myState)
</td>
<td>
@Html.TextBoxFor(m=>m.LineWithState[i].myLine)
</tr>
}