这是我第一次在业务容量中使用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中编辑变量的值,例如Comment
和Value
,但是要使用来自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
的引用。我还需要能够在该视图中引用该模型中的一些变量,但我认为在这种情况下,一个解决方案将是两者的解决方案。
希望我能够解释得很清楚,如果您需要查看更多代码或者我不够清楚,请告诉我。
谢谢你的时间!
答案 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
并忘记它是一个集合。