如何将不同的数据列表从视图传递到控制器MVC

时间:2018-03-26 15:45:16

标签: asp.net-mvc entity-framework

目前我面临着一个非常棘手的问题,即将不同的数据列表从视图传递到控制器。 我创建了两个输入框来将我的数据提交给控制器,以便它可以保存到CreateAccountsDB中并进一步显示在列表中 按下“创建”按钮时选择的子对象。

我面临的问题是:

当使用NewCompanyName文本框和NewEmail文本框中输入的数据按下“创建”按钮时,这些输入的数据会将数据从View传递到Controller并将数据保存到CreateAccountDB(未显示在View中),但输入的数据未显示在列表中选择的子项目。

Create View

这是模型。

public class Tender
    {
        public int ID { get; set; }
        public string CompanyName { get; set; }
        public List<CreateAccount> FrequentCompanyName { get; set; }
        public List<CreateAccount> SuggestCompanyName { get; set; }
        public List<CreateAccount> SelectedCompanyName { get; set; }
        public string CompanyNameNew { get; set; }
        public string EmailNew { get; set; }
        public int? TradeID { get; set; }
        public virtual Trade Trade { get; set; }
        public int? CreateAccountID { get; set; }
        public virtual CreateAccount CreateAccount { get; set; }
    }

以下是控制器中的Get Method of Create功能:

    [httpGet]
    public ActionResult Create(int? id)
    {
        Tender tender = new Tender();
        tender.FrequentCompanyName = db.createaccountDB.Include(tm => tm.Trade).Where(td => td.Frequency == 32).ToList();
        tender.SuggestCompanyName = db.createaccountDB.Include(tm => tm.Trade).ToList();
        if (tender.SelectedCompanyName == null)
        {
            tender.SelectedCompanyName = new List<CreateAccount>().ToList();
        }
        return View(tender);
    }

这是我的创建函数的Post方法:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "ID,CompanyName,TradeID,FrequentCompanyName,SelectedCompanyName,CreateAccountID")] Tender tender ,string CompanyNameNew, string Emailnew)
    {
        CreateAccount accnew = new CreateAccount();
        accnew.CompanyName = CompanyNameNew;
        accnew.Email = Emailnew;
        if(ModelState.IsValid)
        {
            db.createaccountDB.Add(accnew);
            db.SaveChanges();
        }

        if (tender.SelectedCompanyName == null)
        {
            tender.SelectedCompanyName = new List<CreateAccount>().ToList();
        }
        tender.FrequentCompanyName = db.createaccountDB.Include(tm => tm.Trade).Where(td => td.Frequency == 32).ToList();
        tender.SuggestCompanyName = db.createaccountDB.Include(tm => tm.Trade).ToList();
        tender.SelectedCompanyName.ToList().Add(accnew);
        return View(tender);
    }

这是我的创建视图:

@model Tandelion0.Models.Tender
@{
    ViewBag.Title = "Create";
} 

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    <div class="form-group">
        @*@Html.LabelFor(model => model.ProjectName, htmlAttributes: new { @class = "control-label col-md-3" })*@
        <div class="col-md-3">
            <h5>New Company Name</h5>
            @Html.EditorFor(model => model.CompanyNameNew, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.CompanyNameNew, "", new { @class = "text-danger" })
        </div>
        <div class="col-md-3">
            <h5>New Email</h5>
            @Html.EditorFor(model =>  model.EmailNew, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.EmailNew, "", new { @class = "text-danger" })
        </div>
        <div class="container" align="center">
            <input type="submit" value="Create"  class="btn btn-default" />
        </div>
    </div>

    <div class="container row">
        <!--selected subcon column-->
        <div class="container row col-sm-4">
            <h4>
                Selected Subcon
            </h4>

            <div style="overflow-y: scroll; height:250px;">
                <table class="table table-hover">
                    @foreach (var item in Model.SelectedCompanyName)
                    {
                        <tbody>
                            <tr>
                                <td>
                                    @Html.DisplayFor(modelItem => item.CompanyName)
                                </td>
                            </tr>
                        </tbody>
                    }
                </table>
            </div>
        </div>
    </div>

}

到目前为止,我设法在按下创建按钮时将数据从视图保存到CreateAccountsDB,但这些数据无法将它从Post方法Create函数传递给Controller中的Get方法Create函数。从post方法创建函数出来后,数据和列表立即变为空。

由于数据变为空,视图无法从控制器接收任何数据。

我是否知道如何解决从控制器传递数据到视图的问题?我传递数据的方式完全错误吗? 任何建议都是真的很感激。

1 个答案:

答案 0 :(得分:1)

在你的HttpPost Action方法中:

而不是:

tender.SelectedCompanyName.ToList().Add(accnew);

你应该这样做:

tender.SelectedCompanyName.Add(accnew);

调用ToList()。添加(对象)实际上不会添加到SelectedCompanyName.Instead它将添加到通过调用ToList()方法创建的新列表对象,该方法不会返回到tender.SelectedCompanyName。< / p>

然而,更好的方法是使用Post / Redirect / Get Pattern。 而不是从你的post方法返回一个视图,做一个temorary重定向到您的[HttpGet] Create动作方法传递招标的id。