2

Я искал способ использовать атрибут value в помощнике тега радиокнопки, чтобы сообщить, была ли кнопка отмечена или нет, вместо использования отдельного поля для выбора. Я нашел ответ от @Shyju на related question. Я использую модифицированный пример этого ответа, чтобы показать, что я имею в виду.Можно ли установить атрибут атрибута атрибута тега радиокнопки как «checked» в html?

Скажем, у меня есть ViewModel

public class ExampleViewModel 
{ 
    public int Id { get; set; } 
    public string UserName { get; set; } 
    public List<UserRole> Roles { get; set; } 
} 
public class UserRole 
{ 
    public int Id { get; set; } 
    public string RoleName { get; set; } 
    public bool IsSelected { get; set; } 
} 

, который инициализируется в контроллере

public IActionResult Example() 
    { 
     var vm = new ExampleViewModel 
     { 
      Roles = new List<UserRole> 
      { 
       new UserRole {Id = 1, RoleName = "Admin"}, 
       new UserRole {Id = 2, RoleName = "Editor"}, 
       new UserRole {Id = 3, RoleName = "Reader"} 
      } 
     }; 
     return View("Example",vm); 
    } 

и используется в целях

<form asp-controller="Example" asp-action="Save"> 
    <label class="label">User name</label> 
    <div class="col-md-10"> 
     <input asp-for="UserName" type="text" /> 
    </div> 
    <label class="label">Select a Role</label> 
    <div class="col-md-10"> 
     <div class="btn-group" data-toggle="buttons"> 
      @for (var i = 0; i < Model.Roles.Count; i++) 
      { 
       <label class="btn btn-default"> 
        <input asp-for="Roles[i].Id" type="radio" value="@Model.Roles[i].Id" /> 
        <input asp-for="Roles[i].IsSelected" type="radio" value=true /> 
        @Model.Roles[i].RoleName 
       </label> 
      } 
     </div> 
    </div> 
    <input type="submit" /> 
</form> 

То, что я хотел бы достичь с этим, является чтобы прочитать поле UserRole.IsSlect в методе почты контроллера, чтобы узнать, был ли конкретный UserRole проверено или нет. Это решение работает, если пользователь проверяет только одну кнопку и не изменяет выбор. Если пользователь изменяет выбор на другой, то все значения UserRole, которые коснулся пользователь, будут иметь поле IsSelected как значение true.

Возможно ли каким-либо образом установить значение IsSelected в HTML, чтобы отображать только кнопку, которая проверяется при отправке формы или для нее требуется функция JavaScript?

ответ

3

Ваши модели не имеют смысла для переключателей (которые предназначены для выбора одного из многих). Если вы хотите выбрать только один роль, то модели должны быть

public class ExampleViewModel 
{ 
    public int Id { get; set; } 
    public string UserName { get; set; } 
    public int SelectedRole { get; set; } 
    public List<UserRole> RolesList { get; set; } 
} 
public class UserRole 
{ 
    public int Id { get; set; } 
    public string RoleName { get; set; } 
} 

и в представлении

@foreach(var role < Model.RolesList) 
{ 
    <label class="btn btn-default"> 
     <input asp-for=SelectedRole" type="radio" value="role.Id" /> 
     <span>@role.RoleName<span> 
    </label> 
} 

и в методе POST, значение SelectedRole будет содержать Id из выбранного UserRole

Если в качестве альтернативы, вы хотите выбрать несколько ролей, использование существующих моделей вы, но вид становится

@for (var i = 0; i < Model.Roles.Count; i++) 
{ 
    <label class="btn btn-default"> 
     <input asp-for="Roles[i].Id" type="hidden"/> 
     <input asp-for="Roles[i].IsSelected" type="checkbox"/> 
     <span>@Model.Roles[i].RoleName</span> 
    </label> 
} 

и в методе POST, вы можете получить выбранные роли, используя

IEnumerable<UserRole> selectedRoles = model.Roles.Where(x => x.IsSelected); 
+0

Спасибо Стивен, ваш ответ очень ясно и информативно. Я пытаюсь разработать решение, в котором я мог бы установить критерии выбора динамически в представлении. Иногда выбор будет эксклюзивным только (переключатель), и иногда допускается использование нескольких вариантов (флажок). Тогда я мог бы использовать ту же модель в обоих случаях. У меня было ощущение, что это будет невозможно, но я подумал, что попрошу здесь, чтобы быть уверенным. – Yuhis

+0

Совсем нет. Это был хороший ответ на мой вопрос, который, вероятно, был слишком точным. Неявно это решило мою проблему. – Yuhis

+0

@StephenMuecke В моем случае я размещал дополнительный атрибут 'name = RoleType' внутри' 'и всегда получал значение радио но после прочтения вашего сообщения я понял, что при использовании помощника тега мне не нужно использовать атрибут name, так как 'asp-for' автоматически генерирует нам атрибуты имени и идентификатора. После прочтения вашего сообщения я удалил атрибут name и он работает сейчас. Спасибо за то, что он поместил весь необходимый код и кратко объяснил его. – nam

 Смежные вопросы

  • Нет связанных вопросов^_^