C# ASP. NET: проблема с флажком и переключателем - PullRequest
0 голосов
/ 06 марта 2020

Я создаю приложение, в котором пользователи заполняют форму, где настройка некоторых свойств не является обязательной. Это включает в себя флажки и переключатели.

Итак, у меня есть что-то подобное в моей модели:

public class MyModel {
     public bool boolvalue;
     public MyTwoValuedType mytypevalue;
}

, и я имею в виду:

@model MyModel

<form method="post">
   @Html.CheckBoxFor(m => m.boolvalue)

   @Html.RadioButtonFor(m => m.mytypevalue, mytypevalue.Value1)

   @Html.RadioButtonFor(m => m.mytypevalue, mytypevalue.Value2)
</form>

Когда я инициализирую представление, я посылаю пустую модель через return View(); в контроллере, и переключатели не имеют значения (переключатель не отмечен), а флажок не установлен (поэтому его значение равно false). Тем не менее, я хотел бы использовать обнуляемые типы, такие как (bool? и MyTwoValuedType?), один раз, когда я хочу, чтобы, если отправка формы (в представлении) была сделана без пользователя, изменили значение флажков и переключатели, они не получают значение по умолчанию. Даже если при отправке формы произошла ошибка, повторное появление формы (поскольку она не проходит проверку) имеет значения в флажках и переключателях, которые не были установлены пользователем…

Следует ли использовать Html.DropDownListFor с обнуляемыми типами вместо флажков и переключателей? Будет ли это иметь хороший результат?

Ответы [ 3 ]

3 голосов
/ 06 марта 2020

Используйте @ Html .DropDownListFor для обнуляемых свойств , потому что когда вы отправляете пустую модель в поле зрения, а затем в POST, вы получите false в качестве логического возврата. Вы не можете использовать флажок для логической модели.

И если вы хотите использовать флажок и радио для логического значения, тогда используйте jquery для установки значения. но DropdownList лучше всего подходит для логического свойства модели.

2 голосов
/ 06 марта 2020

Что касается использования логического значения nullable в флажках, оно не подходит, поскольку логическое значение nullable может хранить 3 состояния: null, true и false. Но флажок может иметь только true или false на своем контроле. Это потому, что HTML Checkbox не имеет поддержки трех состояний, потому что в то время этой концепции не было. Он разделяет свойство со старым флажком Windows Forms. Поэтому вам нужно использовать dropdownlist для обработки трех состояний. Если вы хотите использовать флажки, то:

  • прекратите использовать nullable логические значения

ИЛИ

  • прекратите пытаться использовать checkbox, потому что тогда состояние null будет преобразовано в false
1 голос
/ 06 марта 2020

Вы сказали: "Я отправляю пустую модель через return View ()" - проверьте, не является ли модель нулевой.

Контроллер:

 public ActionResult Index()
 {
     return View();
 }

 [HttpPost]
 public ActionResult Index(Models.MyModel m)
 {
     return View(m);
 }

Вид:

<form method="post">
    @{

        if (Model == null)
        {
            @Html.CheckBoxFor(m => m.boolvalue)

            @Html.RadioButtonFor(m => m.mytypevalue,false);

            @Html.RadioButtonFor(m => m.mytypevalue,false)
        }
        else
        {
            @Html.CheckBoxFor(m => m.boolvalue)

            @Html.RadioButtonFor(m => m.mytypevalue, Model.mytypevalue.Value1);

            @Html.RadioButtonFor(m => m.mytypevalue, Model.mytypevalue.Value2)
        }
    }
</form>

Модель:

public class MyModel
{
    public bool boolvalue;
    private MyTwoValuedType _mytypevalue;
    public MyTwoValuedType mytypevalue
    {
        get
        {
            if (_mytypevalue == null)
            {
                _mytypevalue = new MyTwoValuedType();
            }
            return _mytypevalue;
        }
        set
        {
            _mytypevalue = value;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...