我正在尝试找出在创建新对象的情况下使用视图模型的最佳方法。
我的视图模型非常简单,包含一个联系人对象和公司的选择列表。
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表单字段在使用
HTML.EditorFor
助手时,以contact.forename
格式将对象值传递回去...@Html.EditorFor(model => model.contact.forename)
如果我使用
FormCollection
作为我的创建操作方法参数,并显式搜索contact.value
,则可以访问它们,但我不能使用Contact对象作为参数,以保持我的代码简洁清晰而不必每次构建新的联系人对象。我尝试将实际的视图模型对象作为参数传递回去,但这只会导致构造函数错误(这很令人困惑,因为视图绑定到视图模型而不是联系人对象)。
有没有一种方法可以定义
Html.EditFor
字段的名称,使值在传递回控制器上的创建操作方法时正确映射到联系人对象?或者我是否犯了一些错误(这是一个学习练习,这是最有可能的解释!)。
在视图中使用视图模型和映射:
如果您的领域模型需要更改,最糟糕的情况是在一个地方更改映射。仅在视图中使用领域模型:
如果您的领域模型发生更改,您需要更新所有使用您的领域模型的视图。当然,您的设计适用于您,并且很可能永远不会出现问题。这取决于您的选择 :) - Nope