【问题标题】:Passing list from view to controller将列表从视图传递到控制器
【发布时间】:2014-09-26 16:09:52
【问题描述】:

我想从 ARCCreate 传递一个对象的 ArrayList,以便可以将项目作为多个条目添加到数据库中,这些是我的代码:

我的模特:

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

}

我的观点:

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

还有我的控制器:

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

这是插入多个条目的正确方法吗?或者是否有更好的解决方案可以将多个条目插入我的数据库?

【问题讨论】:

  • 只是想澄清一下,您使用的是实体框架吗?
  • 是的,你做得对……
  • @DrSchizo..yes.he 正在使用实体...
  • 为什么你的 M_ARC 实体继承了 DbContext?而且您不应该将数据库实体传递给视图。你不应该在你的视图模型中使用数据库实体。
  • 酷。理想情况下,您希望将域模型与实体分开,因此本质上直接公开数据库在视图中的外观通常是不好的做法。另外,不确定是否需要每次都调用 db.SaveChanges() ,只是在循环之外进行?一个提交而不是几个。

标签: c# asp.net asp.net-mvc razor arraylist


【解决方案1】:

我想你可能对 MVC 和 EF 有一些误解。您可能想详细了解这两个概念。

首先,您的“模型”称为M_ARC,并继承自DbContext。从DbContext 继承的类不应该是模型,而是提供一个属性来从/向数据库检索/更新模型。

其次,您不能将数据从视图传递到控制器。情况恰恰相反。当用户单击按钮时会发生什么,表单字段被发布到服务器并由控制器处理。我认为您尝试实现的是渲染视图,以便表单字段具有正确的名称以映射到数组中。这不是一个新问题,您可以在这里找到一些帮助:MVC .NET Model Binding to Array on the fly

【讨论】:

    【解决方案2】:

    我可以看到您想要提交多个条目,其中每个条目都包含以下属性:PeriodeEmailSPDTJatuhTempoDTInformasiBankDT。以下是您应该如何创建模型类

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

    然后将ARCCreateModel的实例传递给控制器​​get方法中的视图

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

    请注意,关键是您如何为每个条目设置文本框的名称属性,即Details[0].EmailSPDTDetails[1].JatuhTempoDT,因此输入的值将与model.Details 属性中的顺序完全相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多