【问题标题】:Return several models into a view with model type IList<> in asp.net MVC在 asp.net MVC 中将多个模型返回到模型类型为 IList<> 的视图中
【发布时间】:2014-04-07 07:24:01
【问题描述】:

我有 2 个模型,它们代表数据库中的 2 个不同的表。我想在一个视图中更改这两个模型。我知道我可以将 2 个模型合二为一并将其传递给视图,但我的视图应该接受 IList&lt;&gt;。问题是我不确定如何在视图中使用组合模型。 我的组合模型如下所示:

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>

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

感谢您的帮助

【问题讨论】:

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


    【解决方案1】:

    您可以使用 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
    }
    

    但是,如果您尝试编辑或显示信息,则使用 razor 有一种更简单的方法。创建编辑器或显示模板:http://www.hanselman.com/blog/ASPNETMVCDisplayTemplateAndEditorTemplatesForEntityFrameworkDbGeographySpatialTypes.aspx

    然后你可以打电话:

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

    【讨论】:

    • 感谢您的回答。我使用 foreach 循环,但在提交表单时在控制器 [HttpPost] 方法中得到 null。我也应该更改编辑器模板吗?
    【解决方案2】:

    您可以通过模型访问属性,例如: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)
    }
    

    【讨论】:

    • 谢谢,但我在 for 循环中得到错误:运算符 '
    • 尝试向 Count() 添加一组括号。
    • 我无法访问像 Model.FORM2_SEC1.xxx 这样的属性,因为 FORM2_SEC1 是 IEnumerable
    • 你从哪里得到这个错误?在您的部分内部,还是在迭代 for() 循环时?
    • 我的意思是我无法访问这些字段,例如@Model.FORM2_SEC1.TITLE。好的,现在我使用 foreach 循环,但是在提交表单时,我的控制器中为 null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多