首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将列表从视图传递到控制器

问将列表从视图传递到控制器
EN

Stack Overflow用户
提问于 2014-08-04 16:20:18
回答 2查看 1.2K关注 0票数 0

我想从ARCCreate传递一个Object的ArrayList,这样项目就可以作为多个条目添加到数据库中,以下是我的代码:

我的模型:

代码语言:javascript
复制
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; }

}

我的观点:

代码语言:javascript
复制
<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>

和我的控制器:

代码语言:javascript
复制
[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");
}

这是插入多个条目的合适方式吗?或者是否有更好的解决方案来将多个条目插入到我的数据库中?

EN

回答 2

Stack Overflow用户

发布于 2014-08-04 16:29:20

我想你可能对MVC和EF有一些误解。您可能想要更多地阅读这两个概念。

首先,您的“模型”从DbContext继承而来,名为M_ARC。从DbContext继承的类不应该是模型,而应该提供一个属性来从数据库中检索模型或将模型更新到数据库中。

其次,您不能将数据从视图传递到控制器。这是另一种方式。当用户单击按钮时发生的事情是,表单域被发送到服务器并由控制器处理。我认为您要实现的目标是呈现视图,以便表单字段具有正确的名称以映射到数组中。不过这不是一个新问题,你可以在这里找到一些帮助:MVC .NET Model Binding to Array on the fly

票数 3
EN

Stack Overflow用户

发布于 2014-08-05 18:38:26

我可以看到您希望提交多个条目,每个条目都包含以下属性:Periode、EmailSPDT、JatuhTempoDT和InformasiBankDT。下面是您应该如何创建模型类

代码语言:javascript
复制
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方法中的视图

代码语言:javascript
复制
[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的定义,您的视图应该如下所示

代码语言:javascript
复制
@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中获得多个条目,如下所示

代码语言:javascript
复制
[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].EmailSPDT或Details[1].JatuhTempoDT,以便输入值的顺序与model.Details属性中的顺序完全相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25114389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档