Почему моя привязка модели MVC не выполняется при обратной передаче для этого перечисления? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть класс модели со значением SomeEnum

public class SomeModel
{
    public SomeEnum MyChoice { get; set; }
}

public enum SomeEnum
{
    OptionOne, OptionTwo, OptionThree
}

У меня есть шаблон редактора, который отображает набор переключателей для перечислений:

@model Enum
@{
    var enumType = Nullable.GetUnderlyingType(ViewData.ModelMetadata.ModelType) 
                   ?? ViewData.ModelMetadata.ModelType;

    var items = Model.SelectListItems(enumType);
}
<div class="form-group">
    @foreach (var item in items)
    {
        var id = Guid.NewGuid();
        <div class="form-check">
                // also tried ViewData.ModelMetadata.PropertyName below
            @Html.RadioButton(ViewData.TemplateInfo.HtmlFieldPrefix, 
                 item.Value, 
                 item.Value.Equals(Model.ToString()), 
                 new {id, @class = "form-check-input"})
            @Html.Label(item.Text, new {@for = @id, @class = "form-check-label"})
        </div>
    }
    @Html.ValidationMessageFor(m => m)
</div>

Что отображается как

<div class="form-group">
    <div class="form-check">
        <input id="guid1" name="MyChoice.MyChoice" checked="checked" 
               class="form-check-input" type="radio" value="OptionOne">
        <label for="guid1" class="form-check-label">Option One</label>
    </div>
    <div class="form-check">
        <input id="guid2" name="MyChoice.MyChoice" 
               class="form-check-input" type="radio" value="OptionTwo">
        <label for="guid2" class="form-check-label">Option Two</label>
    </div>
    <div class="form-check">
        <input id="guid3" name="MyChoice.MyChoice" 
               class="form-check-input" type="radio" value="OptionThree">
        <label for="guid3" class="form-check-label">Option Three</label>
    </div>
    <span class="field-validation-valid" 
          data-valmsg-for="MyChoice" data-valmsg-replace="true"></span>
</div>

Я думаю, что проблема в том, что атрибут name ВСЕГДА рендерит "вдвое" как MyChoice.MyChoice против MyChoice (то же самое при использовании ViewData.ModelMetadata.PropertyName), но я не могу определить причину.

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Решение оказалось заменой

@Html.RadioButton(ViewData.TemplateInfo.HtmlFieldPrefix, 
      item.Value, 
      item.Value.Equals(Model.ToString()), 
      new {id, @class = "form-check-input"})

на:

@Html.RadioButton("", item.Value, 
      item.Value.Equals(Model.ToString()), 
      new {id, @class = "form-check-input"})

Правильно: замена свойства name (описывается как " Имяполе формы и ключ ViewDataDictionary, который используется для поиска значения").с пустая строка заставляет атрибут name в html правильно отображаться, например:

<input id="guid1" class="form-check-input" name="MyChoice" type="radio" value="OptionOne">

... и привязка модели работает как положено, возвращая выбранное значение обратнок форме в модели как перечисление при обратной передаче.Было бы неплохо, если бы это было задокументировано где-то, или еще лучше, не так , но вы идете.

0 голосов
/ 18 апреля 2019

Преобразовать перечисление в строку:

    public class SomeModel
    {
        private SomeEnum _MyChoice { get; set; }
        public string MyChoice
        {
            get { return _MyChoice.ToString(); }
            set { _MyChoice = (SomeEnum)Enum.Parse(_MyChoice.GetType(), value); }
        }
    }

    public enum SomeEnum
    {
        OptionOne, OptionTwo, OptionThree
    }
...