【发布时间】:2012-03-04 18:13:56
【问题描述】:
我正在尝试找出在创建新对象的情况下使用视图模型的最佳方式。
我有一个非常简单的视图模型,其中包含一个联系人对象和一个选定的公司列表。
private ICompanyService _Service;
public SelectList ContactCompanyList { get; private set; }
public Contact contact { get; private set; }
public ContactCompanyViewModel(Contact _Contact)
{
_Service = new CompanyService();
contact = _Contact;
ContactCompanyList = GetCompanyList();
}
private SelectList GetCompanyList()
{
IEnumerable<Company> _CompanyList = _Service.GetAll();
return new SelectList(_CompanyList, "id", "name");
}
然后我就有了使用此视图模型的联系人控制器,使我能够为我的联系人选择相关公司。
[Authorize]
public ActionResult Create()
{
return View(new ContactCompanyViewModel(new Contact()));
}
我的问题是控制器上的 create 方法。
[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Contact _Contact)
{
try
{
_Service.Save(_Contact);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
问题是视图返回一个空的联系人对象,但是!填充了公司 ID,这是因为下拉列表明确声明了其字段名称。
@Html.DropDownList("parent_company_id",Model.ContactCompanyList)
使用HTML.EditorFor 帮助器时,标准 html 表单字段以contact.forename 的格式传回对象值...
@Html.EditorFor(model => model.contact.forename)
如果我使用 FormCollection 作为我的创建操作方法参数,然后显式搜索 contact.value,我可以访问它们,但我不能使用 Contact 对象作为参数来保持我的代码整洁而不必构建每次一个新的接触对象。
我尝试将实际的视图模型对象作为参数传回,但这只会导致构造函数错误(这会让人感到困惑,因为视图绑定到视图模型而不是联系人对象)。
有没有一种方法可以定义Html.EditFor 字段的名称,以便在将值传递回控制器上的创建操作方法时正确映射回联系人对象?或者我是否在某处犯了一些 FUBAR 错误(这是最有可能的解释,因为这是一个学习练习!)。
【问题讨论】:
标签: asp.net-mvc-3