2010-02-02 47 views
1

我有一个视图在MVC 2中,我编辑“页面”。一个页面有一个名称,标题和内容。内容类型为EditableContent,它具有Width,CssClass和Columns。列是一个列表。ASP.NET MVC模型绑定ID不匹配

当我做到这一点的看法:

<%= Html.TextBoxFor(m => m.Name) %> 

它输出以下HTML:

<input type="text" value="About Page" name="Name" id="Name"> 

当我张贴在ContentController编辑动作:

/// <summary> 
/// Edits the specified form. 
/// </summary> 
/// <param name="item">The content page.</param> 
/// <returns>ActionResult for edit</returns> 
[HttpPost] 
public ActionResult Edit(Page item) 
{ 
    if (ModelState.IsValid) 
    { 
    } 

    return View(item); 
} 

它不能将Name属性绑定到item.Name。查看Request.Form中的值,我看到Name参数。

如果我手动呈现文本框,使用这种:

<%= Html.TextBox("item.Name", Model.Name)%> 

的值绑定完全在控制器操作的页面实例。

我在这里做了一些根本性的错误吗?

回答

0

如果你的动作方法的参数命名为项目,在DefaultModelBinder将寻找item.nameitem.titleitem.content.width等,如果它不能找到任何*项目**的请求时,它会忽略项目前缀,回落到空前缀,只是标题content.width等寻找

请求中的其他内容可能被称为项目(或* item。**),导致此回退逻辑不会发生。如果你想强制回退逻辑,用[Bind(Prefix =“”)]来指定参数,其中说:“是的,我知道这个参数被命名为item,但是假装它的名字实际上是''。

0

就在我头顶,你是否尝试在你的Action中为你的Page参数输入完整的命名空间?可能存在命名冲突。

+0

我现在有。这没有帮助。我想知道是否应该在MvcContrib中使用CastleBinder。 – MartinHN 2010-02-02 11:08:58

+0

尝试在视图中使用。谢谢 – 2010-02-02 12:55:07

0

您必须使用模型名称的前缀。这将隔离不同型号的输入。渲染输入时动作

public ActionResult Edit([Bind(Prefix="Page")]Page item) 

{...}

的 例

<%= Html.TextBox("Page.Name", Model.Name)%> 

对不起,现在不如何做到这一点使用佣工lambda表达式。