ASP.NET MVC模型绑定ID不匹配

时间:2010-02-02 10:15:53

标签: asp.net-mvc

我在MVC 2中有一个View,我编辑了一个“Page”。页面具有名称​​,标题和内容。内容属于EditableContent类型,具有Width,CssClass和Columns。列是列表。

当我在视图中执行此操作时:

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

输出以下HTML:

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

当我发布到ContentController中的Edit操作时:

/// <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)%>

该值完美地绑定到控制器操作中的Page实例。

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

3 个答案:

答案 0 :(得分:0)

刚刚开始,您是否尝试在Action中为您的Page参数输入完整的命名空间?可能存在命名冲突。

答案 1 :(得分:0)

您必须为模型名称使用前缀。这将隔离不同模型的输入。 行动举例

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

{...}

渲染输入时

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

很抱歉,现在不要使用带有lambda表达式的帮助程序来完成此操作。

答案 2 :(得分:0)

如果您的操作方法参数名为 item ,则DefaultModelBinder将查找 item.name item.title 项.content.width 等。如果它在请求中找不到任何* item。**,它将忽略 item 前缀并回退到空前缀,只看 name title content.width 等。

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