【问题标题】:Html.RadioButton sets all values to selected valueHtml.RadioButton 将所有值设置为选定值
【发布时间】:2008-11-10 10:57:56
【问题描述】:

在琢磨解决[this][1]问题后,我认为问题的核心如下:

当您将 Html.RadioButton() html 帮助程序与 Enum 作为值字段一起使用时,您只能选择一次选项。重新发布页面后,帮助程序将忽略调用中设置的值并将所有单选按钮设置为相同的值,即您选择的上一个帖子返回的值。 我做错了吗?

示例(观察按钮的

<fieldset>
    <legend>Test</legend>                            
    <div>
        <label for="SearchBag.EffectIndicatorAny" id="EffectIndicatorAnyLabel">
            Any
        </label>                
        <%=Html.RadioButton("SearchBag.EffectIndicator", "Any" , ViewData.Model.SearchBag.EffectIndicatorIsAny, new { @id = "SearchBag.EffectIndicatorAny" })%>
    </div>
    <div>
        <label for="SearchBag.EffectIndicatorSolid" id="EffectIndicatorSolidLabel">
            Solid
        </label>                
        <%=Html.RadioButton("SearchBag.EffectIndicator", "Solid", ViewData.Model.SearchBag.EffectIndicatorIsSolid, new { @id = "SearchBag.EffectIndicatorSolid" })%>
    </div>
    <div>
        <label for="SearchBag.EffectIndicatorEffect" id="EffectIndicatorEffectLabel">
            Effect
        </label>                
        <%=Html.RadioButton("SearchBag.EffectIndicator", "Effect", ViewData.Model.SearchBag.EffectIndicatorIsEffect, new { @id = "SearchBag.EffectIndicatorEffect" })%>
    </div>
</fieldset>

会生成

<fieldset>
    <legend>Effect</legend>                            
    <div class="horizontalRadio">
        <label for="SearchBag.EffectIndicatorAny" id="EffectIndicatorAnyLabel">
            Any                                      
        </label>                
        <input checked="checked" id="SearchBag.EffectIndicatorAny" name="SearchBag.EffectIndicator" type="radio" value="Any" />
    </div>
    <div class="horizontalRadio">
        <label for="SearchBag.EffectIndicatorSolid" id="EffectIndicatorSolidLabel">
            Solid
        </label>                
        <input id="SearchBag.EffectIndicatorSolid" name="SearchBag.EffectIndicator" type="radio" value="Solid" />
    </div>
    <div class="horizontalRadio">
        <label for="SearchBag.EffectIndicatorEffect" id="EffectIndicatorEffectLabel">
            Effect
        </label>                
        <input id="SearchBag.EffectIndicatorEffect" name="SearchBag.EffectIndicator" type="radio" value="Effect" />
    </div>
</fieldset>

并且会生成第二次:

<fieldset>
    <legend>Effect</legend>                            
    <div class="horizontalRadio">
        <label for="SearchBag.EffectIndicatorAny" id="EffectIndicatorAnyLabel">
            Any                                      
        </label>                
        <input id="SearchBag.EffectIndicatorAny" name="SearchBag.EffectIndicator" type="radio" value="Solid" />
    </div>
    <div class="horizontalRadio">
        <label for="SearchBag.EffectIndicatorSolid" id="EffectIndicatorSolidLabel">
            Solid
        </label>                
        <input checked="checked" id="SearchBag.EffectIndicatorSolid" name="SearchBag.EffectIndicator" type="radio" value="Solid" />
    </div>
    <div class="horizontalRadio">
        <label for="SearchBag.EffectIndicatorEffect" id="EffectIndicatorEffectLabel">
            Effect
        </label>                
        <input id="SearchBag.EffectIndicatorEffect" name="SearchBag.EffectIndicator" type="radio" value="Solid" />
    </div>
</fieldset>

【问题讨论】:

    标签: c# html-helper asp.net-mvc-beta1


    【解决方案1】:

    这是由于 ASP.NET MVC Beta 代码中的错误造成的。我在 asp.net MVC 论坛上写了对该问题的完整解释。参考这个link

    【讨论】:

    • 谢谢。我将检查是否可以创建一个覆盖框架错误的 HTML 辅助方法。这样,如果部署了常规测试版,我仍然可以将我的网站部署到环境中。
    • 是的,如果您要部署到带有 MVC 的环境,那么覆盖帮助程序将是可行的方法。就我而言,我选择了 MVC 的“临时”构建,因为我在应用程序 bin 目录中部署 MVC,这样当新的 MVC 版本到来时,我只需替换 dll。
    【解决方案2】:

    万一有人关心这里是一个真正快速而肮脏的工作,以期待框架的下一次更新。它只会用您的值替换值。 它没有经过单元测试,也不能保证。

    把它放在你的 HtmlHelper 类库或者你放置 HtmlHelper 扩展的任何地方。 添加以下用法:

    • System.Text.RegularExpressions;
    • System.Web.Mvc.Html;

      /*ToDo: remove when patched in framework*/
      public static string MonkeyPatchedRadio(this HtmlHelper htmlHelper, string name, object value, bool isChecked, object htmlAttributes){
          string monkeyString = htmlHelper.RadioButton(name, value, isChecked, htmlAttributes);
          monkeyString = Regex.Replace(monkeyString, "(?<=value=\").*(?=\".*)", value.ToString());            
          return monkeyString;
      }
      

    我知道它可以做得更好等等,但我真的希望它会尽快修复。 如果你想让它变得更好,它是社区 wiki,所以继续吧

    【讨论】:

      【解决方案3】:

      要检查的一件事。您是否使用更新后的模型来呈现您的视图? IE。第二次显示时传递给视图的帖子更新的模型数据是否相同?

      【讨论】:

      • 感谢您的回答。新的通过(它适用于我的所有其他领域)。虽然我不明白这与我的问题有什么关系。我将编辑我的帖子以使其更清晰。
      猜你喜欢
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 2017-01-05
      • 2013-12-11
      • 1970-01-01
      相关资源
      最近更新 更多