MVC3模型外键绑定
本文关键字:绑定 模型 MVC3 | 更新日期: 2023-09-27 18:19:00
我花了两天时间试图弄清楚这一点,基本上我有两个模型(事件和EventStyle),但EventStyle一个不会绑定无论我尝试什么。
这些类是Code-First数据库的一部分,Event模型有一个EventStyle外键。
这是我的淡化模型:
public class Event {
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual EventStyle Style { get; set; }
}
public class EventStyle {
public string Id { get; set; }
public string Image { get; set; }
}
在我的控制器中,我有这个:
[HttpPost]
public ActionResult Create(Event evt) { /* add evt to the database */ }
和一个简单形式:
@using (Html.BeginForm()) {
@Html.HiddenFor(evt => evt.Id)
@Html.HiddenFor(evt => evt.Style)
@Html.TextBoxFor(evt => evt.Name)
@Html.TextAreaFor(evt => evt.Description)
}
我实际上有一个自定义的@Html。编辑器为evt。样式来改变隐藏字段的值)
表单提交时,Event与Id
、Name
和Description
正确绑定。然而,Style
属性保持为空,即使隐藏字段在数据库中包含有效的EventStyle
Id。
如果我删除隐藏字段,那么Style将成为默认的样式(在Event的构造函数中设置)
我也尝试在EventStyle上使用ModelBinder
,但正确的Id从未通过bindingContext
,这可能是问题的一部分。
但是,正确的Id确实通过Binder controllerContext
来获得,或者直接使用控制器中的FormCollection
。我更希望ModelBinding能正常工作。
也许ModelBinder不知道我的数据库?如果是这样,我如何让它识别我的数据库?
编辑:嗯,刚刚删除了virtual
,现在Binder正在从表单中拾取正确的Id,但它仍然没有到达事件模型
EDIT2:解决,使用这个从数据库加载EventStyle:
if (evt.Style != null) {
evt.Style = db.EventStyles.Find(evt.Style.Id);
}
使用Id属性:
@Html.HiddenFor(evt => evt.Style.Id)
编辑
需要注意的是,@html.[InputType]For()
助手方法是用来在标记中的元素上设置适当的name/id属性的,这样当它们被发布时,默认的模型绑定器将知道如何在模型上设置属性。
如果你看一下html标记,你会发现你的style元素是这样创建的:
<input id="Style_Id" type="hidden" value="" name="Style.Id" />
这是默认模型绑定器理解的命名约定,也是它用来设置模型属性的。
隐藏字段只能存储标量值。你的EventStyle
类是复杂的,由2个属性组成。这两个属性分别需要两个隐藏字段
@Html.HiddenFor(evt => evt.Style.Id)
@Html.HiddenFor(evt => evt.Style.Image)
您缺少事件模型类中的EventStyle属性,无法使其成为该模型的外键。
只要把它添加到你的Event
模型类,你应该很好。
public int EventStyleId { get;set; }