C# ASP.NET核心:在razor视图中键入enum作为复选框,根据int值单击

C# ASP.NET核心:在razor视图中键入enum作为复选框,根据int值单击,c#,asp.net-core,razor,enums,C#,Asp.net Core,Razor,Enums,在意识到我不能通过javascript(来自不同的机器)真正持久化复选框状态之后,我试图让它在服务器端工作 我所做的是使用此枚举: 名称空间 { [旗帜] 公共枚举属性:uint { /// /// /// a=1, /// /// /// b=2, /// /// /// c=4 } } 并在模型中声明如下: public int-prop { 获取{return prop;} 设置{prop=value;} } 使其作为复选框工作,所以如果单击“第一个”和“最后一个”,

在意识到我不能通过javascript(来自不同的机器)真正持久化复选框状态之后,我试图让它在服务器端工作

我所做的是使用此枚举:

名称空间
{
[旗帜]
公共枚举属性:uint
{
/// 
/// 
/// 
a=1,
/// 
/// 
/// 
b=2,
/// 
/// 
/// 
c=4
}
}
并在模型中声明如下:

public int-prop
{
获取{return prop;}
设置{prop=value;}
}
使其作为复选框工作,所以如果单击“第一个”和“最后一个”,则值将作为5发送,依此类推

这是我的控制器:

在我看来,我已打印为:

foreach(模型中的变量a)
@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 />

    }

}
因此,如果我收到
“prop”:1
,则至少应将一个复选框呈现为选中状态

因此,我正在堆叠、整理和尝试一些东西,但不知道如何使用枚举。。。一些建议?? 如果不够清楚,请告诉我,非常感谢, 奇克


您可以编写自己的自定义模型活页夹,以便在提交表单时将所选复选框值的总和传递给您的操作。请参阅以下演示:

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>

@namespace.AppliesOn.Physical
@namespace.AppliesOn.Sendings
@namespace.AppliesOn.Billing
发送
4.行动:

[HttpPost]
public async Task<IActionResult> SumEnumCheckBox(MyModel myModel)
[HttpPost]
公共异步任务SumEnumCheckBox(MyModel MyModel)
5.结果:

您可以编写自己的自定义模型活页夹,以便在提交表单时将所选复选框值的总和传递给您的操作。请参阅以下演示:

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>

@namespace.AppliesOn.Physical
@namespace.AppliesOn.Sendings
@namespace.AppliesOn.Billing
发送
4.行动:

[HttpPost]
public async Task<IActionResult> SumEnumCheckBox(MyModel myModel)
[HttpPost]
公共异步任务SumEnumCheckBox(MyModel MyModel)
5.结果:

你好,邹兴兴,非常感谢。有了这个,它会记住复选框的状态吗?通过js,我可以使用如下内容获取值:
$(this)[0]。选中===true?数字((result+=valorappliceson)/1):(result-=this.value)并作为JSON对象发送。我遇到的问题是,我记不起是否单击了一个检查,然后在刷新时将其标记(根据值)。你觉得怎么样?我的意思是,我尝试的是这样的:
var isChecked=((Convert.ToInt32(Model)&value)==value)?“选中”:空
并且在
输入中检查
属性,如下所示:
已检查=“@isChecked
@Qiqke我不太理解您的发现。我的答复可能会误解您的要求,并且无法保持状态。IMO,要保持复选框的状态,您可以使用客户端或服务器端的cookie。您可以将所有选定的值保存到asp.net core会话中,然后将它们填充到get方法中。对不起,是我的错,我解释得很糟糕。我将重新表述我的问题,但基本上我尝试的是,如果从服务器端获取appliesOn=5,那么在呈现视图时选中复选框并选中该值。我会改变我的答案的谢谢,你的解决方案很好地解决了我的问题!你好,邹星,非常感谢。有了这个,它会记住复选框的状态吗?通过js,我可以使用如下内容获取值:
$(this)[0]。选中===true?数字((result+=valorappliceson)/1):(result-=this.value)并作为JSON对象发送。我遇到的问题是,我记不起是否单击了一个检查,然后在刷新时将其标记(根据值)。你觉得怎么样?我的意思是,我尝试的是这样的:
var isChecked=((Convert.ToInt32(Model)&value)==value)?“选中”:空
并且在
输入中检查
属性,如下所示:
已检查=“@isChecked
@Qiqke我不太理解您的发现。我的答复可能会误解您的要求,并且无法保持状态。IMO,要保持复选框的状态,您可以使用客户端或服务器端的cookie。您可以将所有选定的值保存到asp.net core会话中,然后将它们填充到get方法中。对不起,是我的错,我解释得很糟糕。我将重新表述我的问题,但基本上我尝试的是,如果从服务器端获取appliesOn=5,那么在呈现视图时选中复选框并选中该值。我会改变我的答案的谢谢,你的解决方案很好地解决了我的问题!