我正在尝试创建一个复杂的 ViewModel,它在公司的详细信息页面中同时具有索引页面和公司注释的创建页面,并且想要一些关于我是否正确执行此操作的指导。
我目前的问题是,当我创建一个新的公司说明时,除了我包含在我的 cshtml 中的 EditorFor 字段之外,它在对象中没有任何信息 - 它丢失了 ViewModel 中的所有数据。
我有一个 Company 模型和 CompanyController,在我的 Details 操作中,我填充了与公司相关的所有注释,以及一个允许用户添加新注释的表单。
我的 Company 和 CompanyNotes 模型非常简单:
public class Company
{
public int CompanyID { get; set; }
// bunch of fields related to the company
public virtual ICollection<CompanyNote> CompanyNotes { get; set; }
}
public class CompanyNote
{
public int CompanyNoteID { get; set; }
public DateTime Date { get; set; }
public string Note { get; set; }
public Company Company { get; set; }
}
我有一个看起来像这样的 ViewModel:
public class CompanyViewModel
{
public Company Company { get; set; }
// List of all notes associated with this company
public IEnumerable<CompanyNote> CompanyNotes { get; set; }
// A CompanyNote object to allow me to create a new note:
public CompanyNote CompanyNote { get; set; }
}
这是我的详细信息操作,它填充公司记录,获取相关注释列表,并显示一个带有新的空对象的创建表单:
public ActionResult Details(int id = 0)
{
var viewModel = new CompanyViewModel();
viewModel.Company = db.Companies.Find(id);
if (viewModel.Company == null)
{
return HttpNotFound();
}
viewModel.CompanyNotes = (from a in db.CompanyNotes
where a.Company.CompanyID.Equals(id)
select a).OrderBy(x => x.Date);
viewModel.CompanyNote = new CompanyNote
{
Date = System.DateTime.Now,
Company = viewModel.Company
};
return View(viewModel);
}
这是我在 CompanyController 中的 CreateNote 操作。(我应该把它分成一个单独的部分视图吗?有什么好处?)
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateNote(CompanyViewModel companyViewModel)
{
CompanyNote companyNote = companyViewModel.CompanyNote;
if (ModelState.IsValid)
{
db.CompanyNotes.Add(companyNote);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(companyViewModel);
}
最后,这是 detail.cshtml 的简化版本:
@model Project.ViewModels.CompanyViewModel
// My company detail display is here, removed for sake of berevity
@using (Html.BeginForm("CreateNote", "Company"))
{
@Html.EditorFor(model => model.CompanyNote.Date)
@Html.TextAreaFor(model => model.CompanyNote.Note})
<input type="submit" value="Create" />
}
当我发布时,我的 CreateNote 操作有一个基本上是空的 companyViewModel,除了 companyViewModel.CompanyNote.Date 和 companyViewModel.CompanyNote.Note,它们是我的表单中的字段 - ViewModel 中的所有其他数据都是空的,所以我不知道如何甚至包括对母公司的引用。
我什至在正确的道路上吗?
谢谢,罗比