使用单个窗体MVC3更新嵌套模型

时间:2012-03-23 04:28:49

标签: asp.net-mvc-3

我有一个名为Devices的实体和一个名为DeviceSerials的实体。单个设备可以包含1个或更多序列号。我想为允许添加一个或多个序列号的设备创建创建和编辑视图。这里的关键是我想将Device模型传递回Device控制器并且该控制器创建或更新设备和序列号

我为DeviceSerials创建了一个编辑器模板,并使用

在我的编辑和创建视图中调用了该模板
@Html.EditorFor(model => model.DeviceSerials)

我为设备创建操作(GET)

public ActionResult Create()
    {
        Device device = new Device();

        DeviceSerial deviceserial = new DeviceSerial();
        device.DeviceSerials.Add(deviceserial);

        return View(device);
    } 

我为设备创建操作(POST)

    [HttpPost]
    public ActionResult Create(Device device)
    {


        if (ModelState.IsValid)
        {
            db.Devices.AddObject(device);
            db.SaveChanges();

            return RedirectToAction("Details", "Site", new { id = device.SiteId });  
        }


        return View(device);
    }

当我点击创建按钮时,我收到以下错误

EntityCollection已经初始化。只应在反序列化对象图时调用InitializeRelatedCollection方法初始化新的EntityCollection。

据说我做了研究并找到了两个解决方案

第一个解决方案修复了我的创建操作,但我的编辑操作仍然给了我同样的错误

解决方案#1:修改创建(POST)操作

    [HttpPost]
    public ActionResult Create([Bind(Exclude="DeviceSerials")]Device device)
    {


        TryUpdateModel(device.DeviceSerials, "DeviceSerials");
        if (ModelState.IsValid)
        {
            db.Devices.AddObject(device);
            db.SaveChanges();

            return RedirectToAction("Details", "Site", new { id = device.SiteId });  
        }
       return View(device);
    }

解决方案#2:实现自定义模型绑定器(我无法工作)

Link to Solution

任何人都可以推荐最好的方式来完成我想要做的事情吗?

0 个答案:

没有答案