【问题标题】:What am I misunderstanding about how Html.TextBoxFor works我对 Html.TextBoxFor 的工作原理有什么误解
【发布时间】:2013-07-24 13:36:04
【问题描述】:

我只是想通过新版本回到 .NET MVC,但我无法理解视图绑定到 DataModel 的方式。

我有一个带有属性“first_name”的模型,并且在 HTML 表单中我有以下内容

<%= Html.TextBox("first_name", Model.first_name)%>
<%= Html.TextBoxFor(model => model.first_name) %> 
<input type="text" name="first_name" id="first_name" class="myLabel" 
       value="<%=Model.first_name %>" />

如果我在我的模型上设置 first_name 属性并执行,则在控制器上的操作中

mymodelObject.first_name = "Test";
return View(mymodelObject);

是什么原因只有第三个文本框选择了这个 first_name 值而其他两个没有?

编辑:

我可能解释得不够清楚,抱歉。想象一下我有 2 个控制器方法 -

public ActionResult Register()
{
    Registration model = new Registration();
    model.first_name = "test";
    return View(model);
}

有了这个,任一绑定都可以工作。

显示后,我单击表单上的按钮并尝试运行:

[HttpPost]
public ActionResult Register(Registration_ViewData model)
{
    model.first_name = "Steve";
    return View(model);
}

我要问的是为什么第 3 个而不是第 2 个绑定到“Steve”作为新名称。

【问题讨论】:

  • 三个文本框是否全部显示,但只有第三个有“测试”?还是只显示第三个文本框?我刚刚在测试应用程序中尝试了您的代码,并且所有三个都可以正常工作。您使用的是哪个版本的 MVC 2?
  • 嗨西蒙,对不起 - 在我似乎无法设置值的 HttpPost 之后添加了更多背景,例如如果我在表单上有一个名为“如果您的名字是史蒂夫,请单击此处”的按钮。然后它填充第三个文本框的值并留下另外两个。抱歉有点初学者,我相信我的解释会让每个人都更难。
  • 这可能与您的 ModelState 有关,因为您发布并返回相同的视图,但您实际上并未使用表单集合值来更新模型。检查您的 ModelState 键和值,看看在第二次渲染页面时,前两个框的值是“test”还是“Steve”。

标签: asp.net asp.net-mvc


【解决方案1】:

您需要清除模型状态,以便您的代码如下所示:

[HttpPost]
public ActionResult Register(Registration model)
{
    ModelState.Clear();
    model.first_name = "Steve";
    return View(model);
}

【讨论】:

    【解决方案2】:

    因为 HTML 助手从 ModelState 而不是模型中读取值。为了改变这种行为,您还需要使用 ModelState。
    (见:Changing model’s properties on postback

    【讨论】:

    • 你说的很对,就像克里斯在上面的评论中一样。 ModelState 仍然具有回发的内容,并且 HTML Helper 默认绑定到该内容,而不是我给它的对象。它只需要 ModelState.Clear();谢谢大家,在向您解释之前,有些事情看起来很复杂!
    • @Doug,如果我没记错的话,ModelState["first_name"].Value = new ValueProviderResult("Steve", "Steve", CultureInfo.CurrentCulture); 也应该可以解决问题。如果您不想清除整个字典。
    • 使用ModelState.Remove("FirstName"); 而不是ModelState["first_name"].Value = ...
    【解决方案3】:

    这应该适用于前两个:

    <%= Html.TextBox("first_name", x => x.first_name)%>
    <%= Html.TextBoxFor(model => model.first_name) %> 
    

    【讨论】:

    • 感谢您的浏览。我将 (model => Model.first_name) 上的案例修复为 (model => model.first_name) 但它没有任何区别。我添加了更多关于我正在做的事情的背景信息,以防万一。
    猜你喜欢
    • 2021-02-23
    • 2013-04-04
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2013-05-01
    • 2021-08-15
    相关资源
    最近更新 更多