我浏览了许多文档,发现了几种尝试制作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;}
}
所以我想在View中,我可以只使用普通类作为虚拟类来创建Create方法。但是,如果我想使用ViewModel来创建2个或更多DataModels来创建视图。我将如何处理。因为我想我总是可以做一个
public virtual Payment payments {get; set;}
public virtual Expense expenses {get; set;}
但我正在尝试为此做好准备,以便动态地具有一个生成费用明细输入的添加按钮。
更不用说IEnumerable了,但是据我所知,我想这需要一个更适合于Editing and Details的ID。
最佳答案
您需要的只是一个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>
是Entity Framework实体导航属性的必需类型。这些原因是非常低的级别,但与实体框架在对象级别处理一对多和多对多关系以及延迟加载等问题有关。但是,ICollection<T>
不适用于通过HTML表单实际提交项目,主要是因为它不可索引。这就是在这种情况下视图模型如此重要的原因。关于c# - MVC ViewModel EntityFrameWork ICollection,IEnumerable虚拟类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29684419/