我在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实例。
我在这里做了一些根本错误的事情吗?
答案 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 =“”)]将参数归属,其中说“是的,我知道这个参数是命名项目,但假装它的名字实际上是''。”