【问题标题】:How to pass different list of data from view to controller MVC如何将不同的数据列表从视图传递到控制器 MVC
【发布时间】:2018-03-27 05:58:14
【问题描述】:

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

我在这里面临的问题是:

当使用 NewCompanyName 文本框和 NewEmail 文本框输入的数据按下 Create 按钮时,这些输入的数据确实将数据从 View 传递到 Controller 并将数据保存到 CreateAccountDB(视图中不显示),但输入的数据不显示在列表中选定的子控制。

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

控制器中Create函数的Get方法如下:

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

这是我的创建函数的发布方法:

    [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 方法 Create 函数出来后,数据和列表立即变为 null。

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

我可以知道如何解决将数据从控制器传递到视图的问题吗?我传递数据的方式完全错误吗? 任何建议都非常感谢。

【问题讨论】:

    标签: asp.net-mvc entity-framework


    【解决方案1】:

    在您的 HttpPost 操作方法中:

    而不是:

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

    你应该这样做:

    tender.SelectedCompanyName.Add(accnew);
    

    调用 ToList().Add(object) 实际上不会添加到 SelectedCompanyName。相反,它会添加到通过调用 ToList() 方法创建的新列表对象,您没有将其分配回tender.SelectedCompanyName。

    然而,更好的方法是使用 Post/Redirect/Get Pattern。 不要从您的 post 方法返回视图,而是暂时重定向到您的 [HttpGet]Create 操作方法,并传递投标的 id。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多