2011-12-28 119 views
0

我花了最近2天试图弄清楚,基本上我有两个模型(Event和EventStyle),但是EventStyle一个不会绑定,不管我尝试什么。MVC3模型绑定外键

这些类是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) 
} 

(其实我有一个custom @ Html.EditorFor for evt.Style它改变了隐藏字段的值)

表单提交时,事件与Id,NameDescription正确绑定。 但是,即使数据库中的隐藏字段包含有效的EventStyle ID,Style属性仍为空。

如果我删除的隐藏字段,然后风格成为默认的一个(如事件的构造函数中设置)

我也尝试使用上EventStyle一个ModelBinder,但正确的ID还没有出现过bindingContext,这可能是问题的一部分。

但是,正确的ID确实通过控制器中的活页夹controllerContext或直接使用FormCollection。我宁愿让ModelBinding正常工作。

也许ModelBinder对我的数据库没有任何认识?如果是这样,我怎么才能让它识别我的数据库?

编辑:嗯只是删除了virtual现在的活页夹从形式拿起正确的ID,但它仍然没有得到对事件模型的

EDIT2:解决,以此来加载从该EventStyle数据库:

if (evt.Style != null) { 
    evt.Style = db.EventStyles.Find(evt.Style.Id); 
} 

回答

0

使用id属性本身:

@Html.HiddenFor(evt => evt.Style.Id) 

编辑

一些需要注意的是,@html.[InputType]For()辅助的方法有哪些要在标记中的元素上设置适当的名称/标识属性,以便在发布时默认模型联编程序将知道如何设置模型上的属性。

如果你看的HTML标记,你会看到你的风格元素创建这样的:

<input id="Style_Id" type="hidden" value="" name="Style.Id" /> 

这是命名约定,默认的模型绑定理解和它用来设置的属性你的模型。

+0

呵呵我忽略了,它似乎在工作,谢谢! 虽然,它不会从数据库中加载Id。我必须通过'event.Style.Id'手动执行此操作吗? – Jorticus 2011-12-28 12:20:16

+0

@Jorticus默认的modelbinder不具备数据库的知识,它的目的是简单地在你的模型中设置在Params中找到的属性。不建议给你的模型绑定器数据库知识。 – Craig 2011-12-28 12:25:26

0

隐藏字段只能存储标量值。你的EventStyle类是复杂的,由2个属性组成。所以,你需要2个隐藏字段为每个2个属性:

@Html.HiddenFor(evt => evt.Style.Id) 
@Html.HiddenFor(evt => evt.Style.Image) 
+0

谢谢!刚才在下面看到了同样的事情。 Image属性实际上将从数据库中提取,我有一个单独的编辑器来编辑EventStyles。 – Jorticus 2011-12-28 12:21:27

0

您在Event Model Class中缺少EventStyle属性,使其成为该模型的外键。

只需将其添加到您的Event模型类,你应该没问题。

public int EventStyleId { get;set; }