从不同模型的剃刀视图

时间:2017-10-04 16:52:22

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

这是我第一次在业务容量中使用MVC,所以如果这是一个容易回答的问题,请原谅我。

我的问题是我有一个用于编辑模型的剃刀视图,我们将其称之为  MainModel。这是MainModel的简化版本:

using System;
using System.Collections.Generic;

namespace MyProject.Models
{
public partial class MainModel
{
    public MainModel()
    {
        SecondModel = new HashSet<SecondModel>();
    }

    public int MainModelId { get; set; }
    public DateTime? DueDate { get; set; }
    public int? CreatedByUserId { get; set; }
    public DateTime? CreatedDateTime { get; set; }
    public bool IsActive { get; set; }

    public virtual ICollection<SecondModel> SecondModel { get; set; }
    public virtual Users CreatedByUser { get; set; }
}
}

MainModel引用了另一个Model SecondModel(原始名称,我知道)。此引用是一个集合,因此可以在剃刀视图中使用foreach循环。这是SecondModel:

namespace MyProject.Models
{
public partial class SecondModel
{
    public int SecondModelId { get; set; }
    public string Comment { get; set; }
    public double? Value { get; set; }
    public int? ThirdModelId { get; set; }
    public bool IsActive { get; set; }

    public virtual ThirdModel ThirdModelVariable { get; set; }
}
}

所以我的问题是我需要能够在SecondModel中编辑变量的值,例如CommentValue,但是要使用来自MainModel的模型的剃刀编辑页面。< / p>

我尝试了一些不同的变体,没有运气。

<input asp-for="SecondModel.Comment" class="form-control" />

通常尝试这样的事情会出现以下错误:

ICollection<SecondModel> does not contain a definition for 'Comment' and no extension method 'Comment' accepting a first argument of type 'ICollection<SecondModel>' could be found

您可能已经注意到SecondModel中还有对ThirdModel的引用。我还需要能够在该视图中引用该模型中的一些变量,但我认为在这种情况下,一个解决方案将是两者的解决方案。 希望我能够解释得很清楚,如果您需要查看更多代码或者我不够清楚,请告诉我。

谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

当您指定要绑定的输入时,必须指定有效的C#访问器(在场景后面,这被解释为表示对特定属性/字段的访问的lambda表达式)。错误消息告诉您ICollection<SecondModel>没有属性Comment,这是正确的,因为SecondModel属性类型为ICollection<SecondModel>而非SecondModel

要修复错误,您必须先从集合中检索特定元素。因此,您可以循环收集并为每个元素生成输入,或者如果您知道它存在则访问特定元素。对于访问元素,您的集合类型有问题,因为您无法使用索引器。您应该将其更改为IList<SecondModel>。然后,您可以访问集合中第一个元素的注释字段的写入输入,如下所示:

<input asp-for="SecondModel[0].Comment" class="form-control" />

访问ThirdModel

<input asp-for="SecondModel[0].ThirdModel.SomeProperty" class="form-control" />

我建议阅读Model binding to a list。这是一个很老的帖子,不使用标签助手,但行为是一样的。

答案 1 :(得分:1)

  

ICollection<SecondModel>不包含&#39;评论&#39;`

的定义

错误很明显。您正在寻找集合中的Comment属性。它应该是

@for (int i=0; i< Model.SecondModel.Count(); i++)
{
    <input asp-for="SecondModel[i].Comment" class="form-control" />
    // other properties
}

或使用HTML Helpers

@for (int i=0; i< Model.SecondModel.Count(); i++)
{
    @Html.TextBoxFor(m => m.SecondModel[i].Comment, new { @class = "form-control" })
     // other properties

    @Html.TextBoxFor(m => m.SecondModel[i].ThirdModelVariable.Property, new { @class = "form-control" })

}

要使索引器起作用,您必须将属性从ICollection<SecondModel>更改为IList<SecondModel>

为了避免这种混淆,只要您拥有IList<T>类型的属性,最好将它们命名为复数。在你的情况下:

public virtual IList<SecondModel> SecondModels { get; set; }

现在,您知道您指的是SecondModels属性,而不是保留SecondModel并忘记它是一个集合。