提交表单并不会带来所有数据

时间:2014-12-03 23:30:25

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

我试图在弹出窗口中使用PartialView添加对象。它是一个简单的租赁应用程序,其数据模型是通过实体框架模型生成的。控制器和视图主要由EF支持。 RentalApplication和RentalObject之间的关系是1到多,这意味着RentalObject总是必须有1个RentalApplication。

我的控制器看起来像这样:

// GET: /Calendar/Add/1
// Create a PartialView using a RentalObject as the model. 
// Use the provided ID to lock in the RentalApplication.
[HttpGet]
public PartialViewResult Add(int id)
{
    return PartialView(
        new RentalObject(db.RentalApplicationSet.FirstOrDefault(x => x.Id == id)));
}

// POST: /Calendar/Add
// Save the submitted RentalObject to the db
[HttpPost]
public ActionResult Add(RentalObject rentalobject)
{
    if (ModelState.IsValid)
    {
        try
        {
            db.RentalObjectSet.Add(rentalobject);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }
    return View();
}

我的对象如下:

public partial class RentalObject
{
    public RentalObject()
    {
        this.Lease = new HashSet<Lease>();
    }

    public RentalObject(RentalApplication rentapp)
    {
        this.Lease = new HashSet<Lease>();
        RentalApplication = rentapp;
        PricePerHour = RentalApplication.DefaultPricePerHour;
        Currency = RentalApplication.DefaultCurrency;
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsAvailable { get; set; }
    public string Illustration { get; set; }
    public string Description { get; set; }
    public decimal PricePerHour { get; set; }
    public string Currency { get; set; }

    public virtual ICollection<Lease> Lease { get; set; }
    public virtual RentalApplication RentalApplication { get; set; }
}

因此,当我打开弹出窗口时(使用@ Ajax.ActionLink来获取第一个控制器添加操作)我创建一个RentalObject with RentalApplication(第二个构造函数)来用作模型。到目前为止,弹出对话框显示了RentApplication中的PricePerHour和Currency值。

但是,当我在PartialView弹出窗口中提交表单时,所有内容都会被复制而不是RentalApplication对象。它最终会使用原始RentalApplication中的PricePerHour和Currency创建一个新的RentalObject对象,但不会在RentalApplication属性下包含该对象本身。我的调试器甚至转到了RentalObject的第一个构造函数。

所以我猜它在从控制器提交到视图(GET)并返回到控制器(POST)时将复杂对象保存在另一个对象中时遇到了麻烦。这对我来说只是糟糕的做法吗?我应该使用ViewModel吗?

1 个答案:

答案 0 :(得分:1)

在过去,我不得不对表单中未更改的对象使用@Html.HiddenFor(m=>m.yourObjectHere),以防止它们再次被新增。我为表格中没有使用的每个对象(约2或3)做了这个。

希望这有帮助。