【问题标题】:Mvc using 2 @model In ViewMvc 在视图中使用 2 @model
【发布时间】:2014-09-30 14:36:31
【问题描述】:

大家好,我有一个将数据填充到表格中的视图 我有这个想法

@model IEnumerable<"Model">

在我看来是这样的

@foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Audit_ID)
            </td>
            //rest of the code
         </tr>
    }

我的问题是如何在视图中输入此内容

@model DAL.EODAuditModel
@model IEnumerable<"Model">

因为我想这样做

@using (Html.BeginForm())
    {
        @Html.ValidationSummary(true)
<fieldset>
            <legend>Employee</legend>
            <div class="editor-label">
                @Html.LabelFor(model => model.Name)
            </div>
            <div class="editor-field">
               @Html.EditorFor(model => model.Name)
               @Html.ValidationMessageFor(model => model.Name)
           </div>
</fieldset>
}

问题是我不能这样做,因为我在视图中定义了 2 个@model,这将引发异常

我想要这个因为这个视图将查看记录并创建新记录。 谢谢。

更新 2:我根据建议编辑我的代码

型号代码:

public class EODAuditModel
    {
        public EODAuditModel()
        {
            this.ExistingRecords = new List<EODAuditModel>();
        }
        public int Audit_ID { get; set; }
        [Required]
        public string Description { get; set; }
        [Required]
        public string CreatedBy { get; set; }
        public DateTime CreatedDate { get; set; }
        public List<EODAuditModel> ExistingRecords { get; set; }
    }

查看代码:

@foreach (var item in Model.ExistingRecords)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Description)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.CreatedBy)
            </td>

        </tr>
    }

控制器代码:

public ActionResult Index()
        {
            EODAuditBL eodBl = new EODAuditBL();
            List<EODAuditModel> eodModel = eodBl.GetEODAudit.ToList();
            return View(eodModel);
        }

获取EODAuditCode:

public IEnumerable<EODAuditModel> GetEODAudit
{
}

当我运行程序时,编译正常,但我得到了这个错误 网页

传入字典的模型项是类型 'System.Collections.Generic.List`1[DAL.EODAuditModel]',但这 字典需要“DAL.EODAuditModel”类型的模型项。

【问题讨论】:

  • 查看更新的答案,我想它会解决你的问题。
  • 是的,谢谢我的朋友,你真的节省了我的时间,谢谢你的时间:)

标签: c# asp.net-mvc asp.net-mvc-5


【解决方案1】:

您可以创建一个包含IEnumerable&lt;"Model"&gt;Name 属性的新模型类。

public class AuditViewModel
{
    public AuditViewModel()
    {
        this.ExistingRecords = new List<EODAuditModel>();
    }
    public string Name { get; set; }
    public List<EODAuditModel> ExistingRecords { get; set; }
}

在您的视图中定义模型,如下所示

@model AuditViewModel

并将foreach 块更改为此

@foreach (var item in Model.ExistingRecords)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Audit_ID)
        </td>
        //rest of the code
     </tr>
}

更新

看起来您遇到了错误,因为在控制器中您将List&lt;DAL.EODAuditModel&gt; 的实例而不是DAL.EODAuditModel 传递给视图。将您的控制器更改为此

public ActionResult Index()
{
    EODAuditBL eodBl = new EODAuditBL();
    List<EODAuditModel> auditList = eodBl.GetEODAudit.ToList();

    EODAuditModel model = new EODAuditModel();
    model.ExistingRecords = auditList;

    return View(model);
}

我将eodModel 更改为auditList 以避免模型与现有记录之间的混淆。

【讨论】:

  • 你从哪里得到错误?你能显示哪一行代码吗?
  • public AuditViewModel() { this.ExistingRecords = new List(); }
  • 您确定该方法放在AuditViewModel 类中吗?如果您为模型使用不同的类名,则构造函数也必须具有相同的名称。
  • 我更新了我的代码供您参考,感谢您的帮助
【解决方案2】:

使用子操作。这就是他们的目的。它们只能用于 GET 请求,因此对于这样的事情,您的视图的模型定义将是创建实例,而您的子操作的模型将是现有项目的列表:

控制器

public ActionResult Index()
{
    var eodBl = new EODAuditBL();
    return View(eodBl);
}

[ChildActionOnly]
public ActionResult ListEODAuditBLs()
{
    // look up from database
    var eodModel = db.EODAudits.ToList();
    return PartialView(eodModel);
}

Index.cshtml

@model Namespace.To.EODAuditBL

@Html.Action("ListEODAuditBLs")

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Employee</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
           @Html.EditorFor(model => model.Name)
           @Html.ValidationMessageFor(model => model.Name)
       </div>
    </fieldset>
}

ListEODAuditBLs.cshtml

@model IEnumerable<Namespace.To.EODAuditBL>

@foreach (var item in Model)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Description)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CreatedBy)
        </td>

    </tr>
}

【讨论】:

    猜你喜欢
    • 2016-11-24
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多