我正在尝试为我的下拉菜单创建多个选项。我能够使列表框工作正常,但是,我试图存储所选项目,所以我尝试使用viewmodel将其存储为集合,但是,我的.cshtml
文件已经调用了db模型,所以我无法在.cshtml
文件中包含viewmodel,因为视图只能有一个模型....即使我尝试使用其他方法调用.cshtml
中的viewmodel,它也是如此一直说这个集合是空的异常错误...
因此,按照这个精彩的youtube视频教程,我决定将ICollection
带到我现有的模型中:
public virtual ICollection<Country> Countries{ get; set; }
一切顺利,直到它说,我应该进行数据库迁移,因为模型已经改变了。
出于安全原因,我需要向sysadmin发送任何更新查询以对数据库运行任何表更改,所以我的问题是,当我使用
时真正发生的事情 public virtual ICollection<Country> Countries{ get; set; }
我现有的桌子有什么变化?我在改变什么?如果没有任何变化,那么为什么我需要进行数据库迁移才能生效?每次我在包管理器控制台中运行update-database时,都会收到一条错误消息,说明我没有权限(我熟悉的错误,需要我将表更改发送到sysadmin)
在viewmodel或模型中存储我的集合的任何想法。 youtube示例在模型中显示?
答案 0 :(得分:0)
添加以下属性时:
public virtual ICollection<Country> Countries{ get; set; }
然后需要在支持Country
的表上添加外键以指向具有此属性的模型。
我不确定您使用视图模型的确切问题,但它非常简单。只需将您需要编辑的任何属性从模型添加到视图模型,然后将视图模型作为视图的模型。
如果收到错误,说集合为空,则需要初始化集合。再次,这是所有非常基本的东西。您可以在视图模型的构造函数中执行此操作,也可以在操作中手动执行此操作等。无论什么对您的应用程序最有意义。
然后,对于选择列表,您必须记住将要发布的值将是标量类型:string,int等。您无法直接发布到需要类{{ {1}}因为模型绑定器根据发布的值不知道如何实例化Country
。通常,您要做的是使用Country
作为选项的值,然后在post操作中,使用id值从数据库中查找实际对象,然后再将它们附加到模型中。
查看模型
Id
<强>控制器强>
public class FooViewModel
{
public FooViewModel()
{
SelectedCountryIds = new List<int>();
}
...
public List<int> SelectedCountryIds { get; set; }
public IEnumerable<SelectListItem> CountryChoices { get; set; }
}
查看强>
private void PopulateCountryChoices(FooViewModel model)
{
model.CountryChoices = db.Countries.Select(m => new SelectListItem
{
Value = m.Id.ToString(),
Text = m.Name
});
}
public ActionResult Foo()
{
var model = new FooViewModel();
PopulateCountryChoices(model);
return View(model);
}
[HttpPost]
public ActionResult Foo(FooViewModel model)
{
if (ModelState.IsValid)
{
var foo = new Foo
{
// map properties from view model
Countries = db.Countries.Where(m => model.SelectedCountryIds.Contains(m.Id))
}
db.Foos.Add(foo);
db.SaveChanges();
return RedirecToAction("Index");
}
// Posted form has errors
PopulateCountryChoices(model);
return View(model);
}