将列表从视图传递到控制器
本文关键字:控制器 视图 列表 | 更新日期: 2023-09-27 18:16:19
我想从ARCCreate传递对象的ArrayList,以便项目可以作为多个条目添加到数据库,这些是我的代码:
My Model:
public class M_ARC : DbContext
{
[Key]
[Display(Name = "Periode")]
[Required]
[RegularExpression("[2][0]([1][4-9]|[2-9][0-9])(0[1-9]|1[012])", ErrorMessage = "Format tidak sesuai. Contoh format : 201407 (Juli 2014)")]
public int Periode { get; set; }
[Display(Name = "Email SPDT")]
[Required]
[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "dd/MM/yyyy", ApplyFormatInEditMode = true)]
public DateTime EmailSPDT { get; set; }
[Display(Name = "Jatuh Tempo")]
[Required]
public DateTime JatuhTempoDT { get; set; }
}
My View:
<tr>
<th>
@Html.Label("Agustus")
</th>
<td>
<input type="text" name="EmailSPDT" class="pengirimanDT" />
</td>
<td>
<input type="text" name="JatuhTempoDT" class="tanggapanDT" />
</td>
<td>
<input type="text" name="InformasiBankDT" class="informasiBankDT" />
</td>
</tr>
<tr>
<th>
@Html.Label("September")
</th>
<td>
<input type="text" name="EmailSPDT" class="pengirimanDT" />
</td>
<td>
<input type="text" name="JatuhTempoDT" class="tanggapanDT" />
</td>
<td>
<input type="text" name="InformasiBankDT" class="informasiBankDT" />
</td>
</tr>
<tr>
<th>
@Html.Label("Oktober")
</th>
<td>
<input type="text" name="EmailSPDT" class="pengirimanDT" />
</td>
<td>
<input type="text" name="JatuhTempoDT" class="tanggapanDT" />
</td>
<td>
<input type="text" name="InformasiBankDT" class="informasiBankDT" />
</td>
</tr>
和Controller:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ARCCreate(List<M_ARC> ARCList)
{
foreach (M_ARC item in ARCList)
{
if (ModelState.IsValid)
{
db.Arcs.Add(item);
db.SaveChanges();
}
else return View();
}
return RedirectToAction("ARCIndex");
}
这是插入多个条目的正确方式吗?或者有更好的解决方案插入多个条目到我的数据库?
我想你可能对MVC和EF有一些误解。您可能需要更多地了解这两个概念。
首先,您的"模型"称为M_ARC
并继承DbContext
。从DbContext
继承的类不应该是模型,而是提供一个属性来从数据库中检索/更新模型。
第二,你不能将数据从视图传递到控制器。事实正好相反。当用户单击按钮时,表单字段被发送到服务器并由控制器处理。我认为您试图实现的是呈现视图,使表单字段具有要映射到数组中的正确名称。这不是一个新问题,但你可以在这里找到一些帮助:MVC .NET模型绑定到数组在飞行
我可以看到您想要提交多个条目,其中每个条目包含这些属性:Periode
, EmailSPDT
, JatuhTempoDT
和InformasiBankDT
。下面是你应该如何创建你的模型类
public class ARCCreateModel
{
public ARCCreateModel()
{
this.Details = new List<ARCCreateDetail>();
}
public List<ARCCreateDetail> Details { get; set; }
}
public class ARCCreateDetail
{
[Display(Name = "Periode")]
[Required]
[RegularExpression("[2][0]([1][4-9]|[2-9][0-9])(0[1-9]|1[012])", ErrorMessage = "Format tidak sesuai. Contoh format : 201407 (Juli 2014)")]
public int Periode { get; set; }
[Display(Name = "Email SPDT")]
[Required]
[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "dd/MM/yyyy", ApplyFormatInEditMode = true)]
public DateTime EmailSPDT { get; set; }
[Display(Name = "Jatuh Tempo")]
[Required]
public DateTime JatuhTempoDT { get; set; }
}
然后在控制器get方法中将ARCCreateModel
的实例传递给视图
[HttpGet]
public ActionResult ARCCreate()
{
ARCCreateModel model = new ARCCreateModel();
// generate the multiple entries
ARCCreateDetail detail1 = new ARCCreateDetail();
detail1.Periode = 201408;
model.Details.Add(detail1);
// add more details if necessary
ARCCreateDetail detail2 = new ARCCreateDetail();
detail2.Periode = 201409;
model.Details.Add(detail2);
return View(model);
}
根据上面的ARCCreateModel
的定义,您的视图应该是这样的
@model ARCCreateModel
@using (Html.BeginForm())
{
<table>
@for (int i = 0; i < Model.Details.Count; i++)
{
<tr>
<th>
@Model.Details[i].Periode
</th>
<td>
<input type="text" name="Details[@i].EmailSPDT" class="pengirimanDT" />
</td>
<td>
<input type="text" name="Details[@i].JatuhTempoDT" class="tanggapanDT" />
</td>
<td>
<input type="text" name="Details[@i].InformasiBankDT" class="informasiBankDT" />
</td>
</tr>
}
</table>
<button type="submit">Submit</button>
}
最后,当您提交表单时,您可以获得model.Details
中的多个条目,如下所示
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ARCCreate(ARCCreateModel model)
{
foreach (ARCCreateDetail item in model.Details)
{
// get the entered values and save to database here
// assuming there's Arc table with properties similar to ARCCreateDetail
Arc arc = new Arc();
arc.Periode = item.Periode;
arc.EmailSPDT = item.EmailSPDT;
arc.JatuhTempoDT = item.JatuhTempoDT;
arc.InformasiBankDT = item.InformasiBankDT;
db.Arcs.Add(arc);
}
// submit the changes to EF
db.SaveChanges();
return RedirectToAction("ARCIndex");
}
请注意,关键是如何设置每个条目的文本框的name属性,即Details[0].EmailSPDT
或Details[1].JatuhTempoDT
,因此输入的值将与model.Details
属性的顺序完全相同。