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

Что я делаю с этим перечислением:

namespace namespace
{
    [Flags]
    public enum prop: uint
    {
        /// <summary>
        /// 
        /// </summary>
        a= 1,
        /// <summary>
        /// 
        /// </summary>
        b= 2,
        /// <summary>
        /// 
        /// </summary>
        c= 4
    }
}

И объявлено так в модели:

public int prop
        {
            get { return prop; }
            set { prop= value; }
        }

Заставьте его работать как флажки, поэтому, если вы нажмете первый и последний, значение будет отправлено как 5 и так далее.

это мой контроллер:

public IActionResult action(int id)
        {

            var model = something

            model.class.class.Select(x => x.prop);

            return View(model);
        }

На мой взгляд, я напечатал как:

foreach(var a in Model)
    @Html.EditorFor(x = > a.prop)

Это шаблон редактора:

@model Enum
@{
    var modelType = @Model.GetType();
}
@foreach (var name in Enum.GetNames(modelType))

{
    var value = Convert.ToInt32(Enum.Parse(modelType, name));

    if (value != 0)

    {

        var isChecked = ((Convert.ToInt32(Model) & value) == value) ? "checked" : null;

        <input type="checkbox" name="@ViewData.TemplateInfo.HtmlFieldPrefix" value="@name"  class="prop" checked="@isChecked" data-valueCheck="@value" />
        @name
        <br />

    }

}

Итак, как я могу сделать, если я отправил 7 на сервер, распечатать чекB. выбран? . Я уже сделал часть js, поэтому он всегда сохраняет правильное значение в объекте js, который я отправляю на сервер, примерно так:

[
  {
    "id": 00000000,
    "prop": 1,
    nestedobjectetc...
...
  }
]

Поэтому, если я получаю "prop": 1, то по крайней мере один флажок должен отображаться как выбранный.

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

0
Qiqke 6 Апр 2020 в 13:47

1 ответ

Лучший ответ

Вы можете написать свою собственную привязку модели, чтобы передать sum выбранных значений флажка вашему действию при отправке формы. См. Демонстрацию ниже:

1.Модель.CS:

public class MyModel
{
    private int appliesOn;

    [BindProperty(BinderType = typeof(EnumToIntModelBinder))]
    public int AppliesOn
    {
        get { return appliesOn; }
        set { appliesOn = value; }
    }
}

2.EnumToIntModelBinder.cs

public class EnumToIntModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        var value = valueProviderResult.Values;

        int sum = 0;

        foreach (var item in value)
        {
            sum += int.Parse(item);
        }

        bindingContext.Result = ModelBindingResult.Success(sum);

        return Task.CompletedTask;
    }
}

3. Вид бритвы:

<form asp-action="SumEnumCheckBox" method="post">
    <div class="checkboxContainer">

        <label class="checkbox">
            <input type="checkbox" name="myModel.AppliesOn" class="appliesOnField" id="" value="1" />@namespace.AppliesOn.Physical
        </label>
        <label class="checkbox">
            <input type="checkbox" name="myModel.AppliesOn" class="appliesOnField" id="" value="2" />@namespace.AppliesOn.Sendings
        </label>
        <label class="checkbox">
            <input type="checkbox" name="myModel.AppliesOn" class="appliesOnField" id="" value="4" />@namespace.AppliesOn.Billing
        </label>
        <div class="col-md-12">
            <button class="btn btn-primary" type="submit">Send</button>
        </div>
    </div>
</form>

4.Действие:

[HttpPost]
public async Task<IActionResult> SumEnumCheckBox(MyModel myModel)

5.Результат: введите здесь описание изображения

3
Ryan 7 Апр 2020 в 05:37
Привет @xing-zou, большое спасибо. При этом он будет помнить состояния флажков? с помощью js я могу взять значения примерно так: $(this)[0].checked === true ? Number((result += valorAppliesOn) / 1) : (result -= this.value); и отправить как объект JSON. У меня проблема в том, что я не могу вспомнить, была ли нажата одна проверка, а затем, когда она обновится, она будет отмечена (в соответствии со значением). Что вы думаете?
 – 
Qiqke
7 Апр 2020 в 10:28
Я имею в виду, что я пытаюсь сделать что-то вроде этого: var isChecked = ((Convert.ToInt32(Model) & value) == value) ? "checked" : null; и они в input имеют атрибут checked, например: checked="@isChecked
 – 
Qiqke
7 Апр 2020 в 11:10
1
Я действительно не понял, что вы нашли. Мой ответ может неправильно понять ваше требование, и он не может сохранить статус. IMO, чтобы сохранить статус флажков, вы можете использовать файлы cookie со стороны клиента или session со стороны сервера. Вы можете сохранить все выбранные значения в основной сеанс asp.net, а затем заполнить их в методе get.
 – 
Ryan
7 Апр 2020 в 11:23
Извините, это была моя вина, я очень плохо объяснил. Я собираюсь переформулировать свой вопрос, но в основном я пытаюсь, если получение со стороны сервера applyOn = 5 , затем проверьте в представлении, когда оно отображается, флажки с отмеченными значениями. Собираюсь изменить свой ответ
 – 
Qiqke
7 Апр 2020 в 12:03
Райан большое спасибо, ваше решение отлично решило мою проблему!
 – 
kavanka
24 Апр 2021 в 23:52