如何在ASP.NET表单提交后保持下拉列表值的选中状态?

rbl8hiat  于 2022-11-26  发布在  .NET
关注(0)|答案(1)|浏览(159)

考虑一下我的ASP.NET页面中的HTML:

<form method="get" action="">
   <select name="name">
      <option value="a">a</option>
      <option value="b">b</option>
   </select>
   <select name="location">
      <option value="x">x</option>
      <option value="y">y</option>
   </select>
   <input type="submit" value="Submit" />
</form>

提交表单时,如何确保下拉列表中的选定值保持选中状态?
注意:类似于PHP的这个问题,但我的问题是针对使用.NET Framework 4.5.2的ASP.NET MVC应用程序:
Keep values selected after form submission
在我的.cshtml页面的HTML中,我有这样的内容:

<table border="0" width="100%">
    <tr>
        <th width="20%"></th>
        <th width="20%">Selection</th>
        <th></th>
    </tr>
    <tr>
        <td align="right">By Model/By Month:</td>
        <td>
            @Html.DropDownListFor(m => m.ByModel,
            new List<SelectListItem>() {
                new SelectListItem() { Text = "", Value = "" },
                new SelectListItem() { Text = "By Model", Value = "Model" },
                new SelectListItem() { Text = "By Month", Value = "Month" }
            }, new { @onchange = "updateForm('1')" })
        </td>
        <td>@Model.ByModel</td>
    </tr>
    <tr>
        <td align="right">By Region/By Dealer/ All Regions:</td>
        <td>
            @Html.DropDownListFor(m => m.ByRegion,
            new List<SelectListItem>() {
                new SelectListItem() { Text = "", Value = "" },
                new SelectListItem() { Text = "By Region", Value = "Region" },
                new SelectListItem() { Text = "By Dealer", Value = "Dealer" },
                new SelectListItem() { Text = "All Regions", Value = "All" }
            },
            new { @id = "ByRegion", @onchange = "updateForm('2')" })
        </td>
        <td>@Model.ByRegion</td>
    </tr>
    <tr>
        <td align="right">Region:</td>
        <td>
            @Html.DropDownListFor(m => m.Region,
                Model.Regions,
                new { @onchange = "updateForm('3')" })
        </td>
        <td>@Model.Region</td>
    </tr>
    <tr>
        <td align="right">Dealership:</td>
        <td>
            @Html.DropDownListFor(m => m.DealerID, new List<SelectListItem>())
        </td>
        <td>@Model.Dealership</td>
    </tr>
    <tr>
        <td></td>
        <td><input type="submit" value="Submit" class="submit" onclick="history.go(-1);" /></td>
        <td></td>
    </tr>
</table>

我已经成功地显示了@Model对象的信息,但它没有显示我需要的Dealer Name。
在该页面的底部,有几行添加的Javascript:

<script>

    const updateForm = (changeElement) => {
        let byModel = document.getElementById("ByModel");
        let byRegion = document.getElementById("ByRegion");
        let region = document.getElementById("Region");
        let dealership = document.getElementById("DealerID");
        window.byModel = byModel;
        window.byRegion = byRegion;
        window.region = region;
        window.dealership = dealership;

        //Removes dealership value when region is changed, used in logic below
        if (changeElement === '3') {
            dealership.value = "";
        }
        //Removes dealer list if ByRegion is anything other than By Dealer and dealership is not blank
        //This is used for when the form submits to refresh the list without needing to interact with the dropdowns
        if (byRegion.value !== "Dealer" && dealership.value.length > 0) {
            dealership.innerHTML = "";
        }
        //if All Regions is selected submit the form - previous functionality
        if (changeElement === '2' && byRegion.value === "All" && byModel.value.length > 0) {
            region.innerHTML = "";
            document.forms[0].submit();
        }
        //Checks that region has a value and dealership does not (because this function is run on page load/refresh)
        //Pulls in dealer values
        if (0 < region.value.length && byRegion.value === "Dealer" && dealership.value.length < 1) {
            getDealers(region);
        } else {
            $('#DealerID').prop('disabled', true);
            $("#DealerID").html("").show();
        }
        if (window.selectedDealerName != null) {
            setTimeout(() => {
                dealership.value = window.selectedDealerName;
            }, 5000);
        }
    }

    function getDealers(e) {
        let value = $(e).val();
        $.get("@Url.Action("GetDealers", "Admin")?region=" + value, function (res) {
            var markup = "";
            for (var i = 0; (res != null) && (i < res.length); i++) {
                markup += '<option value='+res[i].Value+'>'+res[i].Text+"</option>"
            }
            $('#DealerID').prop('disabled', false);
            $("#DealerID").html(markup).show();
        });
    }

    window.onload = function refreshForm() {
        updateForm();
    }

</script>

我从来不知道Javascript可以在$.get语句中调用这样的代码隐藏。
但是,调用它会导致DealerID的下拉列表的值丢失。
在代码隐藏中,C#是一个简单的数据库拉取:

private static RetailActivityDealers m_dealerships;

[HttpGet]
public ActionResult GetDealers(string region)
{
    if (m_dealerships == null)
    {
        m_dealerships = RetailActivityModelData.GetDealers();
    }
    var dealerships = new List<SelectListItem>
    {
        new SelectListItem() { Text = "", Value = "" }
    };
    if (string.IsNullOrWhiteSpace(region))
    {
        foreach (var dealer in m_dealerships)
        {
            dealerships.Add(new SelectListItem() { Text = dealer.Name, Value = dealer.Number });
        }
    }
    else
    {
        foreach (var dealer in m_dealerships.Where(x => x.Region == region))
        {
            dealerships.Add(new SelectListItem() { Text = dealer.Name, Value = dealer.Number });
        }
    }
    return Json(dealerships, JsonRequestBehavior.AllowGet);
}
vbkedwbf

vbkedwbf1#

这是Web表单还是MVC?
对于Web表单,如果使用www.example.com控件,则视图状态为自动asp.net。
因此,假设如下标记:

<asp:DropDownList ID="DropName" runat="server">
    <asp:ListItem>a</asp:ListItem>
    <asp:ListItem>b</asp:ListItem>
</asp:DropDownList>

<asp:DropDownList ID="DropLocation" runat="server" style="margin-left:25px">
    <asp:ListItem>x</asp:ListItem>
    <asp:ListItem>y</asp:ListItem>
</asp:DropDownList>

<asp:Button ID="cmdMyChoice" runat="server" Text="Submit" style="margin-left:25px"
    CssClass="btn"
    OnClick="cmdMyChoice_Click" />

<br />
<br />
Result
<asp:TextBox ID="TextBox1" runat="server" style="border-radius:1em">
</asp:TextBox>

按钮单击后面代码是

Protected Sub cmdMyChoice_Click(sender As Object, e As EventArgs)

    TextBox1.Text =
        $"{DropName.SelectedItem.Text} - {DropLocation.SelectedItem.Text}"

End Sub

结果是:

因此,这取决于您创建的项目类型。
因此,控件的“状态”通常是自动管理的。

相关问题