当在.net MVC中使用EnumDropDownListFor时,只返回第一个可选择的选项,无论选择哪个选项标签



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

枚举类:

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

razor页面的模型:

@model VehicleSearchFormViewModel

表单的代码:

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

EnumDropDownList代码:

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

控制器中的搜索方法。例如,假设我在下拉列表中选择"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; }
}
}   

车辆搜索类(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>

My Index GET

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">

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

将视图模型属性的名称更改为vehicleHolderOptions,并在视图中使用@Html。

最新更新