我试图在弹出窗口中使用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吗?
答案 0 :(得分:1)
在过去,我不得不对表单中未更改的对象使用@Html.HiddenFor(m=>m.yourObjectHere)
,以防止它们再次被新增。我为表格中没有使用的每个对象(约2或3)做了这个。
希望这有帮助。