0

我正在使用 MVC 2。当我这样做时:

      <%: Html.HiddenFor(model => model.SourceType) %>

我在视图中得到了这个:

      <input id="SourceType" type="hidden" value="" name="SourceType">

在控制器中返回视图之前,我确认模型具有正确的值。该值正确设置为 11。

我开始尝试不同的东西,看看是否能得到任何不同的结果,发现如果我像这样重复文本框:

      <%: Html.HiddenFor(model => model.SourceType) %>
      <%: Html.HiddenFor(model => model.SourceType) %>

结果如下:

      <input id="SourceType" type="hidden" value="" name="SourceType">
      <input id="SourceType" type="hidden" value="11" name="SourceType">

谁能想到为什么视图使用空白值呈现第一个文本框而第二个包含正确值的原因?

编辑:我认为这可能是由 javascript 引起的,所以我从页面中删除了所有脚本,但第一次该值仍然为空白,重复时正确。

编辑:基于 jle 的链接我试过这个:

      <input type="hidden" value="<%= Html.AttributeEncode(Model.SourceType) %>" id="SourceType" name="SourceType" />
      <input id="SourceType" type="hidden" value="11" name="SourceType">
      <input id="SourceType" type="hidden" value="11" name="SourceType">

得到了这个:

      <input id="SourceType" type="hidden" name="SourceType" value="">
      <input id="SourceType" type="hidden" value="11" name="SourceType">
      <input id="SourceType" type="hidden" value="11" name="SourceType">

另外,根据我在返回视图之前在控制器中尝试过的链接:

      ModelState.Clear();

结果还是一样。要呈现的第一个值是空白。

编辑:这是控制器代码:

      Source source = SourceService.NewSource();
      return View("Source", Mapper.Map(source, new SourceViewModel()));

编辑:问题似乎与使用 HiddenFor 助手无关。

我这样做了:

      <%: Model.SourceType %>
      <%: Html.HiddenFor(model => model.SourceType) %>
      <%: Html.HiddenFor(model => model.SourceType) %>

得到了这个:

      11
      <input id="SourceType" type="hidden" value="" name="SourceType">
      <input id="SourceType" type="hidden" value="11" name="SourceType">

编辑:按照 jle 的输入,我尝试了这个但仍然没有运气:

      <input id="SourceType" type="hidden" value="<%: Model.SourceType %>" name="SourceType">
      <%: Html.HiddenFor(model => model.SourceType) %>
      <%: Html.HiddenFor(model => model.SourceType) %>

这导致:

      <input id="SourceType" type="hidden" name="SourceType" value="">
      <input id="SourceType" type="hidden" value="11" name="SourceType">
      <input id="SourceType" type="hidden" value="11" name="SourceType">

编辑:如果我在不使用帮助程序时排除名称并使用 type="text" 而不是 type="hidden"。这会呈现值,但不会发布,因为它缺少名称(我认为)。

这个:

      <input id="SourceType" type="text" value="<%: Model.SourceType %>" style="visibility: hidden;"/>

结果在发布时不会绑定到模型?添加名称如何影响值?

      <input id="SourceType" type="text" style="visibility: hidden;" value="11">

编辑:如果有人能想到一些可以尝试的东西,我很想听听。我采取了一种丑陋的工作,涉及在视图模型上添加一个stand in 属性。这允许我在控制器中设置 stand in 属性值,该值在页面上按预期呈现。在发布后,我必须手动将属性映射回 SourceType 属性。啊...

4

2 回答 2

0

尝试添加 ModelState.Remove("SourceType"); 在控制器中:

ModelState.Remove("SourceType");
Source source = SourceService.NewSource();
return View("Source", Mapper.Map(source, new SourceViewModel()));

如果 ModelState 中已经存在与您的值对应的值,它将首先使用该值。或者,我会仔细检查该值是否正确映射到 ViewModel。当您说您检查了这一点时,您是检查模型本身还是仅检查 Source 属性?

编辑:试试<input id="SourceType" type="hidden" value="<%: Model.SourceType %>" name="SourceType">

于 2014-06-11T18:23:31.243 回答
0

确保您没有具有相同属性名称的空查询字符串参数。HiddenFor似乎更喜欢查询字符串中的内容而不是模型中的内容。

于 2015-08-28T16:27:35.830 回答