【问题标题】:When using EnumDropDownListFor in .Net MVC only the first selectable option is returned, regardless of which option tag is selected在 .Net MVC 中使用 EnumDropDownListFor 时,无论选择哪个选项标签,都只返回第一个可选选项
【发布时间】:2023-04-07 21:21:01
【问题描述】:

我使用的是 EnumDropDownList,但无论选择哪个选项,只有第一个可选选项(“0”,因为枚举值从 1 开始)作为输入值返回。我错过了什么?

枚举类:

public enum vehicleStatus
{
    Status1 = 1,
    Status2,
    Status3
}

剃须刀页面的模型:

@model VehicleSearchFormViewModel

表格代码:

@using (Html.BeginForm("Search", "Vehicles", FormMethod.Post))

EnumDropDownList 的代码:

<div class="input-field">
@Html.EnumDropDownListFor(model => model.SearchParameters.vehicleStatus)
</div>    

Controller 中的搜索方法。例如,我在 dropDownList 中选择“Status2”。如果我在调试过程中到达方法时设置断点,carDetails 对象中的 vehicleStatus 的值仍然是“0”。

[HttpPost]
    public ActionResult Search(VehicleSearchFormViewModel carDetails)
    {

        IEnumerable<Vehicles> searchResults =_db.SearchResults(carDetails);

        carDetails.SearchResults = searchResults;

        return View(carDetails);
    }

我的视图模型:

using System.Collections.Generic;
using System.Web.Mvc;
using TRAP.Models;
using System.ComponentModel.DataAnnotations;

namespace TRAP.ViewModels
{
public class VehicleSearchFormViewModel
{
    private TrapDb db = new TrapDb();

    public IEnumerable<SelectListItem> vehicleHolder { get; set; }

    public IEnumerable<SelectListItem> CategoryOptions { get; set; }

    public IEnumerable<SelectListItem> SubCategoryOptions { get; set; }

    public VehicleSearch SearchParameters { get; set; }

    public IEnumerable<Vehicles> SearchResults { get; set; }
}
}   

VehicleSearch 类(searchParameters):

using TRAP.Models;
namespace TRAP.ViewModels
{
public class VehicleSearch
{
    public int? vehicleId { get; set; }

    public int? diarieNumber { get; set; }

    public string vehicleHolder { get; set; }

    public string Category { get; set; }

    public string subCategory { get; set; }

    public string registeredDateStart { get; set; }

    public string registeredDateEnd { get; set; }

    public bool? deregistration { get; set; }

    public vehicleStatus vehicleStatus { get; set; }
}
}

在网络浏览器中检查下拉菜单时:

<select id=”SearchParameters_vehicleStatus” name=”Searchparameters.vehicleStatus” data-val-required=”The vehicleStatus field is required.” data-val=”true”>
<option value="0" selected="selected"></option>
<option value="1">Status1</option>
<option value="2">Status2</option>
<option value="3">Status3</option>
</select>

我的索引获取

public ActionResult Index()
        {
            var viewModel = new VehicleSearchFormViewModel()
            {
                SearchParameters = new VehicleSearch()
            };

            using (var db = new TrapDb())
            {
                var allOptionsList = new List<SelectListItem> { new SelectListItem { Text = "", Value = "" } };
                var vehicleHolder = 
                    allOptionsList.Union(
                        db.Vehicles
                            .Select(
                                x => new SelectListItem { Value = x.vehicleHolder, Text = x.vehicleHolder }))
                            .ToList();

                var categoryOptions = allOptionsList.Union(db.Vehicles.Select(x => x.Category).Distinct().Select(m => new SelectListItem() { Value = m, Text = m })).ToList(); //distinct/unique

                var subCategoryOptions = allOptionsList.Union(db.Vehicles.Select(m => new SelectListItem() { Value = m.subCategory, Text = m.subCategory }).Distinct()).ToList();

                viewModel.vehicleHolder = vehicleHolder;
                viewModel.SubCategoryOptions = subCategoryOptions;
                viewModel.CategoryOptions = categoryOptions;
            }

            return View(viewModel);
        }

全景

@using TRAP.ViewModels
@model VehicleSearchFormViewModel

@{
    ViewBag.Title = "Index";
}

@section scripts{

    <script type="text/javascript">
        $(document).ready(function () {
            $(".datefieldFrom").datepicker();
        });
        $(document).ready(function () {
            $(".datefieldTo").datepicker();
        });
    </script>
}

<nav class="left-nav">
    <ul>
        <li>Systemkonfigurerare</li>
        <li><img class="navIcon" src="~/Content/images/arrow.png">@Html.ActionLink("Tillbaka till startsida", "Index", "Home")</li>
        <li><img class="navIcon" src="~/Content/images/addDocument.png">Ansöka om ny fordonstyp</li>
        <li><img class="navIcon" src="~/Content/images/addDocument.png">Registrera ny fordonstyp</li>
        <li><img class="navIcon" src="~/Content/images/addDocument.png">Registrera ny sammansatt fordonstyp</li>
        <li><img class="navIcon" src="~/Content/images/addDocument.png">Registrera ny fordonsindivid</li>
        <li><img class="navIcon" src="~/Content/images/calender.png"> Fordonstyper med avvikelser </li>
        <li><img class="navIcon" src="~/Content/images/calender.png">Antal godkännanden </li>
        <li><img class="navIcon" src="~/Content/images/calender.png">Sök utgångna godkännanden </li>
        <li><img class="navIcon" src="~/Content/images/calender.png">Statistik fordonstyper </li>
        <li><img class="navIcon" src="~/Content/images/coins.png">Årlig avgift</li>
        <li><img class="navIcon" src="~/Content/images/coins.png">Årlig avgift(detalj)</li>
        <li><img class="navIcon" src="~/Content/images/key.png">Systemkonfiguration</li>
    </ul>
</nav>

<div class="vehicle-page-upper-body">
    <div class="body-title-div">
        <h3 class="body-title">Sök fordonsindivid</h3>
    </div>
    @using (Html.BeginForm("Search", "Vehicles", FormMethod.Post))
    { 
     <div id="left-search-div-container">

        <div class="search-field-div">
            <label class="input-label">
                @Html.DisplayNameFor(model => model.SearchParameters.vehicleId)
            </label>
            <div class="input-field">
                @Html.TextBoxFor(x => x.SearchParameters.vehicleId)
            </div>
        </div>

        <div class="search-field-div">
            <label class="input-label">
                @Html.DisplayNameFor(model => model.SearchParameters.diarieNumber)
            </label>
            <div class="input-field">
                @Html.TextBoxFor(x => x.SearchParameters.diarieNumber)
            </div>
        </div>

        <div class="search-field-div">
            <label class="input-label">
                @Html.DisplayNameFor(model => model.vehicleHolder)
            </label>
            <div class="input-field">
                @Html.DropDownList("carDetails.SearchParameters.vehicleHolder", Model.vehicleHolder)
            </div>
        </div>
        <br />

          <div class="search-field-div">
              <label class="input-label">
                  @Html.DisplayNameFor(model => model.SearchParameters.Category)
              </label>
              <div class="input-field">
                  @Html.DropDownList("carDetails.SearchParameters.category", Model.CategoryOptions)
                   /
                  @Html.DropDownList("carDetails.SearchParameters.subCategory", Model.SubCategoryOptions)
              </div>
          </div> <br />

        <div class="search-field-div">
            <label class="input-label">
                @Html.DisplayNameFor(model => model.SearchParameters.registeredDateStart)

            </label>
            <div class="input-field">
                <input type="text" name="carDetails.SearchParameters.registeredDateStart" class="datefieldFrom" /> <img class="calenderIcon" src="~/Content/images/calender.png" /> - 
                <input type="text" name="carDetails.SearchParameters.registeredDateEnd" class="datefieldTo" /> <img class="calenderIcon" src="~/Content/images/calender.png" />
            </div>
        </div>

          <div class="search-field-div">
              <label class="input-label">
                  @Html.DisplayNameFor(model => model.SearchParameters.deregistration)
                  @Html.CheckBox("carDetails.SearchParameters.deregistration", Model.SearchParameters.deregistration)

              </label>

          </div><br /><br />

          <div class="search-field-div">
              <label class="input-label">
                  @Html.DisplayNameFor(model => model.SearchParameters.vehicleStatus)
              </label>
              <div class="input-field">
                  @Html.EnumDropDownListFor(model => model.SearchParameters.vehicleStatus)

              </div>
          </div>

        <div id="search-buttons">
            <input type="submit" value="Sök" />
            <input type="reset" value="Rensa" />
        </div>

    </div>

    <div id="right-search-div-container">

    </div>
    }

</div>

<div class="vehicle-page-middle-body">
   <div class="body-titel-div">
       <h3 class="body-title">Sök fordonstyp</h3>
       <p id="underProgressText"><i>Kommer snart..</i></p>
   </div>

</div>

<div class="vehicle-page-lower-body">
    <div id="lower-body-checkbox">
        @Html.CheckBox("keepSearchResult") 
        @Html.DisplayName("Behåll sökresultat")
    </div>

    <div class="body-titel-div">
        <h4 class="lower-body-titles">Om fordonsregistret</h4>
    </div>

    <p class="lower-body-text">Transportstyrelsens register över järnvägsfordon är ett IT-verktyg som används för att registrera fordonstyper och godkända fordonsindivider.</p>
    <p class="lower-body-text">Registret ska vara tillgängligt för de anställda men till viss del även för extrema användare. Verksamhetsutövare kan ansöka om ett användarkonto, och få tillgång till valda delar av registret. Det är till exempel möjligt att få en förteckning på sina egna registrerade fordon och att påbörja en ansökan om godkännande av ny fordonstyp.</p>
    <p class="lower-body-text">Allmänheten ser, baserat på fordonsnummer, viss utvald data från registret via Transportstyrelsens webbplats. Registret innehåller uppgifter om de viktigaste egenskaperna hos fordonen både på fordonstyp- och fordonsindividnivå</p>

    <div class="body-titel-div">
        <h4 class="lower-body-titles">Användarmanual</h4>
    </div>
    <p class="lower-body-text">
        Överst till höger finns en användarmanual Ladda ner manual. Här finns tips om hur ni använder de olika funktionerna i registret.

    </p>


</div>
<hr id="bottom-hr">

【问题讨论】:

  • 奇怪,我将您的代码复制并粘贴到了一个新项目中,它可以正常工作。发布您的索引 GET 操作
  • 你在使用MVC5.1+中的EnumDropDownListFor()方法吗? (我无法重现您的问题)
  • @JB06 我现在已经添加了我的索引 GET
  • @StephenMuecke 是的,我是
  • 我仍然无法重现此问题。添加您的完整视图代码。我注意到的另一件(不相关的)事情是您的视图模型中有一个未使用的数据库变量。也许你应该删除它。

标签: c# asp.net-mvc enums


【解决方案1】:

EnumDropDownListFor 的问题是模型绑定器无法正常工作的副作用,因为您的视图模型中的属性和 SearchParameter 类具有相同的名称,vehicleHolder。

将视图模型属性的名称更改为 vehicleHolderOptions 并在您的视图中使用 @Html.DropDownListFor 而不是 @Html.DropDownList。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多