将几个模型返回到具有模型类型IList<>的视图中。在asp.net MVC中

时间:2014-04-07 07:24:02

标签: c# asp.net-mvc ienumerable ilist

我有2个模型代表数据库中的2个不同的表。我想在一个视图中更改这两个模型。我知道我可以将两个模型合并为一个并将其传递给视图,但我的视图应该接受IList<>。问题是我不确定如何在视图中使用组合模型。 我的组合模型看起来像这样:

public class FORM2_COMMON
{
    public IEnumerable<FORM_2_SEC_1> FORM2_SEC1 { get; set; }
    public IEnumerable<FORM_2_SEC_2> FORM2_SEC2 { get; set; }
}

在我的控制器中我有:

public ActionResult EditReport(ReportParam param)
{
  FORM2_COMMON common = new FORM2_COMMON();
  common.FORM2_SEC1 = db.FORM_2_SEC_1.Where(e => e.YEAR == param.Year && e.MONTH == param.SelectedMonth).OrderBy(e => e.LINE_CODE).ToList();
  common.FORM2_SEC2 = db.FORM_2_SEC_2.Where(e => e.YEAR == param.Year && e.MONTH == param.SelectedMonth).OrderBy(e => e.LINE_CODE).ToList();

   return PartialView(common);
 }

然后将表格汇总:

[HttpPost]
 public ActionResult EditReportSubmit(FORM2_COMMON report)
    {
        if (ModelState.IsValid)
        {
            foreach (FORM_2_SEC_1 sec1 in report.FORM2_SEC1)
            {
                db.Entry(sec1).State = EntityState.Modified;
            }
            foreach (FORM_2_SEC_2 sec2 in report.FORM2_SEC2)
            {
                db.Entry(sec2).State = EntityState.Modified;
            }

            db.SaveChanges();
            return RedirectToAction("ReportForm2", "OPSReports");
        }
        return View(report);

    }

在视图中:

@model Proj.Models.FORM2_COMMON

@for (var i = 0; i < Model.Count; i++) //confused here
{
            <tr> </tr>
}

现在我不知道如何分别遍历Model.FORM2_SEC1Model.FORM2_SEC2

当我将一个模型传递给视图时,一切都很简单,我通常编码如下:

 @model IList<FORM_2_SEC_1>

 @for (var i = 0; i < Model.Count; i++)
 {
                <tr>
                    <td> @Html.DisplayFor(x=>x[i].TITLE)</td>
                     ......
                 </tr>
  }

我还有模型的编辑模板(FORM_2_SEC_1.cshtml):

@model FORM_2_SEC_1

<tr>
    <td> @Html.DisplayFor(x => x.TITLE)</td>
    .......
</tr>

那么我如何为我的组合模型应用相同的逻辑呢?

我很感激任何帮助

2 个答案:

答案 0 :(得分:0)

您可以通过以下模型访问属性:Model.FORM2_SEC1.xxx

@model Proj.Models.FORM2_COMMON

// iterate FORM2_SEC1 - same goes for FORM2_SEC2.
@for (var i = 0; i < Model.FORM2_SEC1.Count(); i++) 
{
            <tr> </tr>
}

或使用foreach循环,它可以直接访问项目,而不是通过索引访问它。

@foreach(var item in Model.FORM2_SEC1)
{
    <tr>
        <td>@item.SomeValue</td>
    </tr>
}

对于FORM2_SEC1和FORM2_SEC2,这种方法是相同的,因为它们都是一个列表。

修改

回发时列表为空。

尝试添加一组隐藏值以填充对象的静态字段。

@for(int i = 0; i < Model.FORM2_SEC1.Count(); i++)
{
    @Html.HiddenFor(item => m.FORM2_SEC1[i].Id) 
    @Html.TextBoxFor(m => m.FORM2_SEC1[i].Title)
}

答案 1 :(得分:0)

您可以使用foreach语句或for ...

简单地迭代您的集合

FOREACH:

@foreach(var x in model.FORM2_SEC1) {
   // Do whatever you want with x
}

有关:

@for(int i=0;i<model.FORM2_SEC1.Count;i++) {
   // Do whatever you want
}

但是,如果您正在尝试编辑或显示信息,那么剃须刀有一种更简单的方法。创建编辑器或显示模板:http://www.hanselman.com/blog/ASPNETMVCDisplayTemplateAndEditorTemplatesForEntityFrameworkDbGeographySpatialTypes.aspx

然后你可以打电话:

@Html.EditorFor(model => model.FORM2_SEC1)