ASP. NET Core: введите enum в качестве флажков в представлении бритвы, щелкнув по значению int - PullRequest
0 голосов
/ 06 апреля 2020

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

Что я делаю с этим enum:

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 на сервер, распечатать чек. выбран? , Я уже выполнил часть js, поэтому она всегда сохраняет правильное значение в объекте js, который я отправляю на сервер, примерно так:

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

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

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

1 Ответ

1 голос
/ 07 апреля 2020

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

1.MyModel.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. Результат: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...