即使提供了显式值,HtmlHelper.TextBox也会使用模型值

时间:2012-09-04 22:07:54

标签: c# asp.net-mvc asp.net-mvc-3 visual-studio-2010 html-helper

在视图中我使用HtmlHelper.TextBox的{​​{3}}:

public static MvcHtmlString TextBox(
    this HtmlHelper htmlHelper,
    string name,
    Object value
)

文档说明:

  

     
    

输入:System.Object

         

文本输入元素的值。 如果此值为null ,则会从ViewDataDictionary对象中检索元素的值。如果那里不存在任何值,则从ModelStateDictionary对象中检索该值。

  

当我调用此重载时,我确实提供了value,并且此值不为null。尽管如此,文本框的值只有在ModelStateDictionary存在时才会从HtmlHelper中检索。

为了强制文本框使用内联提供的值,我必须先在控制器中重置模型(或从密钥集合中删除带有文本框名称的密钥)。

同样适用于{{1}}呈现的其他控件。

我的理解在哪里错了?或者这是文档中的错误吗?

3 个答案:

答案 0 :(得分:2)

ModelState在所有输入助手中始终具有优先权,而不仅仅是TextBox。这允许您在视图中指定默认值,并在POST后呈现发布的值(取自ModelState),而不必手动将发布的值传递给视图。要使用其他值,必须从ModelState中删除该条目。

答案 1 :(得分:1)

这是模型绑定器的工作方式,它从模型状态获取值,可能是为了保留失败的回发或验证失败的值。您是否尝试过使用Html属性设置值

Html.TextBox("Id", new { Value = Model.Id})

的Si

答案 2 :(得分:-1)

也许这会有所帮助。

使用具有以下属性的viewmodel和ViewData [“textboxvalue”]

public string Id { get; set; }

如果您提供了一个可以绑定到“value”参数的对象,那么html帮助器将始终使用其值。

- 绑定到视图模型的文本框值 - 这些显示模型的id

@Html.TextBox("Id", Model.Id)

- 具有来自视图数据的提供值的文本框 - 这些显示视图数据的值

@Html.TextBox("Id", ViewData["textboxvalue"])

即使提供的名称与属性名称不同,该值仍将是模型提供的值

- 绑定到视图模型的文本框值 - 这些显示模型的id

@Html.TextBox("Id2", Model.Id)

- 具有来自视图数据的提供值的文本框 - 这些显示视图数据的值

@Html.TextBox("Id2", ViewData["textboxvalue"])

如果您提供自己的自定义

- 提供硬编码值的文本框 - 显示视图中提供的字符串

@Html.TextBox("Id", "my hardcoded value in view")

文档说明 - 如果您没有填充“value”参数,如下所示:

@Html.TextBox("Id", null)

然后mvc框架将自动尝试搜索绑定到视图的模型和数据字典。

如果你有这种情况,那么

- 在视图模型中创建一个名为“Id”的属性。文本框值设置为模型的值

@Html.TextBox("Id", null)

但是如果“name”值不是model / dictionaries中的属性/键,那么框架找不到任何值,所以文本框值将是一个空字符串

- 名称在视图模型或视图数据中不属性的文本框

@Html.TextBox("Id2", null)