Html.RadioButton устанавливает все значения в выбранное значение

StackOverflow https://stackoverflow.com/questions/277607

Вопрос

Поработав над решением [этой][1] проблемы, я думаю, что суть проблемы заключается в следующем:

Когда вы используете html-помощник Html.RadioButton() с полем значения 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>
Это было полезно?

Решение

Это связано с ошибкой в ​​бета-коде ASP.NET MVC.Я написал полное объяснение проблемы на форуме asp.net MVC.Обратитесь к этому связь

Другие советы

Если кому-то интересно, вот очень быстрая и грязная работа в ожидании следующего обновления фреймворка.Оно только регулярно заменяет значение вашим значением.Это не модульное тестирование, не гарантия и т. д.

Поместите его в свою библиотеку классов HtmlHelper или куда бы вы ни поместили расширения HtmlHelper.добавьте следующие использования:

  • System.Text.RegularExpressions;
  • Система.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;
    }
    

Я знаю, что это можно сделать лучше и еще много чего, но я очень надеюсь, что это все равно скоро исправят.Если вам хочется сделать это лучше, это вики-сообщество, так что вперед.

Одна вещь, чтобы проверить. Используете ли вы обновленную модель для визуализации своего представления? То есть те же данные модели, которые были обновлены из сообщения, переданного представлению во второй раз, когда оно отображается?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top