viewmodel和scaffolding迁移

时间:2014-12-05 16:12:00

标签: c# asp.net-mvc entity-framework asp.net-mvc-4

我正在尝试为我的下拉菜单创建多个选项。我能够使列表框工作正常,但是,我试图存储所选项目,所以我尝试使用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示例在模型中显示?

1 个答案:

答案 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);
}