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与IdNameDescription正确绑定。然而,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);
}

MVC3模型外键绑定

使用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; }