在MVC EF ASP.NET中正确处理ModelView响应

时间:2017-07-03 15:05:37

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

我需要模型,比如A和B

public class A
{
public int AID {get; set; }
public string Name {get; set;}
public virtual B B {get; set;}
}

public class A
{
[ForeignKey("A")]
public int BID {get; set; }
public string Name {get; set;}
public virtual A A {get; set;}
}

和ViewModel

public class ABViewModel
{
public A A {get;set;}
public B B {get;set;}
}

然后我想要一个View,它允许我同时设置两个模型的名称,所以控制器看起来像

public ActionResult Create()
{
var viewModel = new ABViewModel();
return View(viewModel);
}

到目前为止,反应如何?类似下面的内容会返回错误

  

值不能为空。参数名称:entity

    public ActionResult Create([Bind(Include = "A, B")] ABViewModel stuff)
    {
        if (ModelState.IsValid)
        {
            db.A.Add(stuff.A); // <-- here occurs the error
            stuff.B.A = stuff.A;
            db.B.Add(stuff.B);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(stuff);
    }

1 个答案:

答案 0 :(得分:2)

这次你不需要ViewModels。

您的A包含BB包含A

第一。选择其中一个,让我选择A

public ActionResult Create()    {
    var model = new A();
    model.B = new B();
    return View(model);
}

然后你修改&#34;视图&#34; A内容和A.B内容

public ActionResult Create([Bind] A stuff)
{
    if (ModelState.IsValid)
    {
        db.A.Add(A);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(stuff);
}

一旦A包含B,就不需要添加B.B的ModelState也将设置为ModelState.Added

回答你的问题。在该行:db.A.Add(stuff.A); A不包含已初始化的B实例。 A.B为空。这就是您收到错误的原因。

您必须先将B添加到A,然后保存数据库。如果你真的想创建一个ViewModel,那就做吧。:

stuff.A.B = stuff.B;
db.A.Add(stuff.A); // <-- Here is all good cause now A contains B.
stuff.B.A = stuff.A; // there is no need for it anymore
db.B.Add(stuff.B); // no need, B was already added on A.Add(...)
db.SaveChanges();