目前我面临着一个非常棘手的问题,即将不同的数据列表从视图传递到控制器。 我创建了两个输入框来将我的数据提交给控制器,以便它可以保存到CreateAccountsDB中并进一步显示在列表中 按下“创建”按钮时选择的子对象。
我面临的问题是:
当使用NewCompanyName文本框和NewEmail文本框中输入的数据按下“创建”按钮时,这些输入的数据会将数据从View传递到Controller并将数据保存到CreateAccountDB(未显示在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方法创建函数出来后,数据和列表立即变为空。
由于数据变为空,视图无法从控制器接收任何数据。
我是否知道如何解决从控制器传递数据到视图的问题?我传递数据的方式完全错误吗? 任何建议都是真的很感激。
答案 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。