如何将List <tuple>从Table传递给Controller?

时间:2017-09-08 09:28:18

标签: c# asp.net-mvc entity-framework nullreferenceexception

我在使用EF Core 1.2的C#中有这个代码,我有一个包含两个提交按钮的表单。第一个按钮&#39;上传&#39;调用我的方法&#39; UpLoadMyFile&#39;比较 从我的textarea到模式的每一行,并返回一个字符串,告诉我它是否匹配一个模式。 然后我将所有文本及其状态添加到

 List <Tuple<string, string>> 

我通过ViewModel传递给我的View并在表格中显示每一行及其状态。

现在,当我点击第二个按钮&#39;保存时,我尝试将每行保存到我的数据库中。但每次我尝试保存我的行时都会发生NullReferenceException 告诉我我的表中的列表为空。

我想知道如何传递我的Table&#39; MyTupleList&#39;中的所有行和状态。我的帖子方法,因为我真的不知道如何解决我的问题。

我的观点:

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

        }

1 个答案:

答案 0 :(得分:0)

我设法解决了我的问题,感谢@StephenMuecke的评论,而不是使用Tupel自制的课程

public class MyListModel
{
    public string myLine { get; set; }
    public string myState { get; set; }
}
}

并在我的ViewModel

中创建一个List
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>

                }