我已经阅读了很多文档,并找到了几种尝试创建CreateViewModel的方法。
我想知道ICollection的作用。
public Payment{
public int ID {get; set;}
public string Details {get; set;}
public virtual ICollection<Expense> Expenses {get; set;}
}
public Expense{
public int ID {get; set;}
public string MyDetails {get; set;}
}
所以我想在我的视图中,我可以只使用普通类作为虚拟来创建一个Create方法。但是,如果我想使用ViewModel创建一个包含2个或更多DataModel for Creation的视图。我该怎么做呢因为我想我总能做一个
public virtual Payment payments {get; set;}
public virtual Expense expenses {get; set;}
但我正在尝试准备动态添加按钮生成费用详细信息输入。
更不用说,IEnumerable也是如此,但我想这需要一个更适合编辑的ID和我理解的细节。
答案 0 :(得分:3)
您需要的只是PaymentViewModel
课程,您将使用List<Expense>
代替ICollection<Expense>
:
public class PaymentViewModel
{
// ID property unnecessary here because it doesn't need
// to be posted from the form
public string Details { get; set; }
// You may want to use something like `List<ExpenseViewModel>`
// based on your needs
public List<Expense> Expenses { get; set; }
}
通过这种方式,您可以确保输入名称的格式为Expenses[N].MyDetails
,其中N
是索引,从而向表单添加其他费用记录。无论您使用哪种JavaScript解决方案向表单添加额外的费用记录,都应使用正确索引的名称创建这些输入。这将是一个使用JavaScript模板解决方案的好地方,或者像Knockout一样处理数据绑定的东西。
要编辑现有费用,如果您有需要,只需生成与任何集合相关的字段,但您需要使用for
循环而不是更传统的foreach
:
@for (var i = 0; i < Model.Expenses.Count(); i++)
{
@Html.EditorFor(m => m.Expenses[i].MyDetails)
}
作为旁注,自从您提问,ICollection<T>
是实体框架的实体导航属性所需的类型。这些原因非常低,但与实体框架处理对象级别的一对多和多对多关系以及延迟加载等问题的方式有关。但是,ICollection<T>
并不适用于通过HTML表单实际提交项目,主要原因是它无法编制索引。这就是视图模型在这种情况下如此重要的原因。