在 ASP.NET Core 中使用单选按钮输入类型控制复选框组输入类型

Controlling a Checkbox group input type with a Radio button input type in ASP.NET Core

在我的 Visual Studio 2019 ASP.NET Core 5.0 MVC 项目中,我希望使用一个公开的 Joke API 在 information about a Joke API 这是一个 try out form for a joke api。 现在我被困在这个表单顶部的 catergory/categories 的实现中,我想要实现的功能如下:

案例一: In the image for category/categories the state of radio and checkboxes are shown

这里如果启用自定义单选按钮和其中两个复选框(对应于此单选,例如由其控制的 Programming 和 Misc,如图所示 然后请求 URL 变成如下图:(忽略 UI 中的所有其他过滤器) Custom radio enabled with Programming and Misc check boxes checked

案例二: Here the Any radio button is clicked 取消单击自定义单选按钮并禁用其所有复选框,结果请求 URL 如下所示 Request URL

到目前为止,我对 getrequestURL 操作方法的看法是:

@model WebAPIConsume.ViewModels.JokeRequestURLVM
<form method="post" enctype="multipart/form-data" asp-action="GetRequestURL" asp-controller="Jokes">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>

    <div class="form-group">
        <label asp-for="category" class="control-label"> Select category/categories</label>
        @*<input type="radio" value="Any" /> Any
        <input type="radio" value="Custom" name="Custom" /> Custom:*@
    <div><input type="radio" name="category" value="Any" class="control-label" checked="checked" /> Any</div>
    <div>
        <input type="radio" name="category" value="Custom" class="control-label" /> Custom:
        <input type="checkbox" name="customcategory" value="Programming" class="control-label" /> Programming
        <input type="checkbox" name="customcategory" value="Misc" class="control-label" /> Misc
        <input type="checkbox" name="customcategory" value="Dark" class="control-label" /> Dark
        <input type="checkbox" name="customcategory" value="Pun" class="control-label" /> Pun
        <input type="checkbox" name="customcategory" value="Spooky" class="control-label" /> Spooky
        <input type="checkbox" name="customcategory" value="Christmas" class="control-label" /> Christmas
    </div>  
</form>
JokesController code:
[HttpGet]
        public  IActionResult  GetRequestURL()
        {

          return View();
        }

View Model:
public class JokeRequestURLVM
    {
        public string category { get; set; }
        public string language { get; set; }
        public string format { get; set; }
        public Joke joke { get; set; }
        public Flags flags  { get; set; }
        public int amount   { get; set; }
    }
Models:
Joke:
public class Joke
    {
        public string type { get; set; }
        public string joke { get; set; }
        public string setup { get; set; }
        public string delivery { get; set; }
        public int id { get; set; }
        public Flags flags { get; set; }
    }

public class Flags
    {
        public bool nsfw { get; set; }
        public bool religious { get; set; }
        public bool political { get; set; }
        public bool racist { get; set; }
        public bool sexist { get; set; }
    }

最后,在实现问题描述中的 objective 之后,如何使用选中的单选按钮(任意)或(自定义)单选按钮的值及其选中的复选框组说编程和杂项,以便请求的结果字符串如下所示: Request URL

我希望将此请求 URI 作为字符串传递给 Jokes Controller 中的 GetRequestURL() 操作方法

2021 年 2 月 9 日更新

您可以获得如下所示的 Categories

    [Route("~/Jokes/GetRequestURl/{categories}")]
    public IActionResult GetRequestURl(string Categories)
    {
       string[] CategoryList = Categories.Split(',');
       return Json(CategoryList);
    }

测试结果:


2021 年 2 月 8 日更新

已从 JokeAPI 的 Javascript file 更新为 buildURL()

<!DOCTYPE html>
<html lang="en">
<head>
    <script>
        var settings = {
            baseURL: "https://127.0.0.1",
            Endpoint: "Jokes/GetRequestURL",
            anyCategoryName: "Any",
        };

        window.onload = function () { reRender(); };

        function reRender() {

            var isValid = false;
            document.getElementsByName("category").forEach(function (el) {
                if (!el.checked)
                    return;

                if (el.value == "Any") {
                    isValid = true;
                    ["cat-cb1", "cat-cb2", "cat-cb3", "cat-cb4", "cat-cb5", "cat-cb6"].forEach(function (cat) {
                        document.getElementById(cat).disabled = true;
                    });
                }
                else {
                    var isChecked = false;
                    ["cat-cb1", "cat-cb2", "cat-cb3", "cat-cb4", "cat-cb5", "cat-cb6"].forEach(function (cat) {
                        var cel = document.getElementById(cat);
                        cel.disabled = false;

                        if (cel.checked)
                            isChecked = true;
                    });

                    if (isChecked)
                        isValid = true;
                }
            });


           buildURL();

        }

        //#MARKER build URL
        function buildURL()
        {
            var queryParams = [];

            //#SECTION categories
            var selectedCategories = [settings.anyCategoryName];
            if(document.getElementById("Custom").checked)
            {
                selectedCategories = [];
                if(document.getElementById("cat-cb1").checked)
                {
                    selectedCategories.push("Programming");
                }
                if(document.getElementById("cat-cb2").checked)
                {
                    selectedCategories.push("Miscellaneous");
                }
                if(document.getElementById("cat-cb3").checked)
                {
                    selectedCategories.push("Dark");
                }
                if(document.getElementById("cat-cb4").checked)
                {
                    selectedCategories.push("Pun");
                }
                if(document.getElementById("cat-cb5").checked)
                {
                    selectedCategories.push("Spooky");
                }
                if(document.getElementById("cat-cb6").checked)
                {
                    selectedCategories.push("Christmas");
                }

                if(selectedCategories.length == 0)
                {
                    selectedCategories.push(settings.anyCategoryName);
                }
            }

            tryItURL = settings.baseURL + "/" + settings.Endpoint + "/" + selectedCategories.join(",");

            if(queryParams.length > 0)
            {
                tryItURL += "?" + queryParams.join("&");
            }

            document.getElementById("urlBuilderUrl").innerText = tryItURL;
        }

    </script>
</head>
<body>
    <form method="post" enctype="multipart/form-data" asp-action="GetRequestURL" asp-controller="Jokes">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>

        <div class="form-group">
            <label asp-for="category" class="control-label"> Select category/categories</label>
            @*<input type="radio" value="Any" /> Any
            <input type="radio" value="Custom" name="Custom" /> Custom:*@

            <div><input type="radio" name="category" value="Any" checked="checked" id="Any" class="control-label" checked="checked" onchange="reRender()" /> Any</div>
            <div>
                <input type="radio" name="category" value="Custom" class="control-label" id="Custom" onchange="reRender()" /> Custom:
                <input type="checkbox" name="customcategory" id="cat-cb1" value="Programming" class="control-label" onchange="reRender()" /> Programming
                <input type="checkbox" name="customcategory" id="cat-cb2" value="Misc" class="control-label" onchange="reRender()" /> Misc
                <input type="checkbox" name="customcategory" id="cat-cb3" value="Dark" class="control-label" onchange="reRender()" /> Dark
                <input type="checkbox" name="customcategory" id="cat-cb4" value="Pun" class="control-label" onchange="reRender()" /> Pun
                <input type="checkbox" name="customcategory" id="cat-cb5" value="Spooky" class="control-label" onchange="reRender()" /> Spooky
                <input type="checkbox" name="customcategory" id="cat-cb6" value="Christmas" class="control-label" onchange="reRender()" /> Christmas
            </div>
            <span id="urlBuilderUrl">/Jokes/GetRequestURL</span>
    </form>
</body>
</html>

测试结果:


你可以用JavaScript来控制。

<!DOCTYPE html>
<html lang="en">
<head>
    <script>
        window.onload = function () { reRender(); };

        function reRender() {

            var isValid = false;
            document.getElementsByName("category").forEach(function (el) {
                if (!el.checked)
                    return;

                if (el.value == "Any") {
                    isValid = true;
                    ["cat-cb1", "cat-cb2", "cat-cb3", "cat-cb4", "cat-cb5", "cat-cb6"].forEach(function (cat) {
                        document.getElementById(cat).disabled = true;
                    });
                }
                else {
                    var isChecked = false;
                    ["cat-cb1", "cat-cb2", "cat-cb3", "cat-cb4", "cat-cb5", "cat-cb6"].forEach(function (cat) {
                        var cel = document.getElementById(cat);
                        cel.disabled = false;

                        if (cel.checked)
                            isChecked = true;
                    });

                    if (isChecked)
                        isValid = true;
                }
            });

        }

    </script>
</head>
<body>
    <form method="post" enctype="multipart/form-data" asp-action="GetRequestURL" asp-controller="Jokes">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>

        <div class="form-group">
            <label asp-for="category" class="control-label"> Select category/categories</label>
            @*<input type="radio" value="Any" /> Any
            <input type="radio" value="Custom" name="Custom" /> Custom:*@

            <div><input type="radio" name="category" value="Any" checked="checked" id="Any" class="control-label" checked="checked" onchange="reRender()" /> Any</div>
            <div>
                <input type="radio" name="category" value="Custom" class="control-label" id="Custom" onchange="reRender()" /> Custom:
                <input type="checkbox" name="customcategory" id="cat-cb1" value="Programming" class="control-label" onchange="reRender()" /> Programming
                <input type="checkbox" name="customcategory" id="cat-cb2" value="Misc" class="control-label" onchange="reRender()" /> Misc
                <input type="checkbox" name="customcategory" id="cat-cb3" value="Dark" class="control-label" onchange="reRender()" /> Dark
                <input type="checkbox" name="customcategory" id="cat-cb4" value="Pun" class="control-label" onchange="reRender()" /> Pun
                <input type="checkbox" name="customcategory" id="cat-cb5" value="Spooky" class="control-label" onchange="reRender()" /> Spooky
                <input type="checkbox" name="customcategory" id="cat-cb6" value="Christmas" class="control-label" onchange="reRender()" /> Christmas
            </div>
    </form>
</body>
</html>

测试结果: