【问题标题】:DropDownListFor not always showing selected valueDropDownListFor 并不总是显示选定的值
【发布时间】:2013-11-14 16:23:21
【问题描述】:

我正在开发一个可以选择使用 VIN 解码器来获取汽车信息的应用程序。您可以输入 VIN,也可以通过下拉菜单、制造商、年份、品牌、型号等进行选择。

制造商下拉菜单是页面上唯一初始化的内容,没有选择值。选择制造商将查找该制造商的所有可用年份并返回年份列表,以及返回制造商列表和选定的制造商列表。选择年份将返回可用制造商、年份和制造商的列表,同时确定选定的制造商和选定的年份,依此类推。

此工作流程运行良好,我的所有下拉菜单均正确显示。但是,当输入 VIN 时,我已经为每个选项选择了值,并且仍然可以找到可用选项的列表,并完全按照我之前手动选择选项的方式呈现页面。当我这样做时,除了制造商之外,所有下拉列表都使用正确的选定属性正确呈现。

我试图尽可能地隔离它,并剥离了其他所有东西,我现在有了这个:

查看:

@model My_Project.Models.Data 

@using System.Web.Helpers

@using (Html.BeginForm("Temp", "Home", FormMethod.Post, new { id = "formIndex" }))
{
    <div>
        VIN:&nbsp;
        @Html.TextBox("vin", Model.VIN) <button type="submit">Go!</button>
    </div>
    <div>
        Manufacturer: (@Model.ManufacturerId)
        @Html.DropDownListFor(m => m.ManufacturerId, Model.Manufacturers, new { style = "width: 175px;" })
    </div>
}

型号:

namespace My_Project.Models
{
    [Serializable]
    public class Data
    {
        public string VIN { get; set; }
        public int ManufacturerId { get; set; }
        public SelectList Manufacturers { get; set; }
    }
}

控制器:

public ActionResult Temp()
{
    Data model = new Data
    {
        Manufacturers = DBAccess.getManufacturers()
    };

    Session["ModelData"] = model;

    return View(model);
}

[HttpPost]
public ActionResult Temp(Data newData)
{
    Data oldData = Session["ModelData"] as Data;

    oldData.ManufacturerId = 20;

    Session["ModelData"] = oldData;

    return View(oldData);
}

如果我在 Temp() 中设置制造商 ID,那么无论选择哪个制造商,我的下拉列表都会正确呈现。如果它在发布响应中设置,下拉列表会呈现所有正确的选项,但没有选择正确的制造商。如果您查看视图,我实际上让它向我显示制造商 ID,以确保它正确获取数据,并且制造商 ID 设置为列表中的值,但未选中。

鉴于用于渲染视图的模型看起来相同,我无法弄清楚这两个实例之间的区别。最重要的是,如果通过选择制造商来调用 post 方法(此时我已经剥离了该功能),它将返回相同的模型但也可以正确渲染。

什么会导致这个在帖子返回时无法正确呈现?

【问题讨论】:

    标签: asp.net-mvc html.dropdownlistfor dropdownlistfor


    【解决方案1】:

    如果您需要设置值from controller post method我认为您需要使用新值更新ModelState。我认为这是因为即使您将更新的模型传递给视图,ModelState 仍然保留旧值。

    试试这个:

    [HttpPost]
    public ActionResult Temp(Data newData)
    {
        Data oldData = Session["ModelData"] as Data;
        oldData.ManufacturerId = 20;
        Session["ModelData"] = oldData;
    
        //Update model state with new ManufacturerId here
        CultureInfo myCulture = new System.Globalization.CultureInfo("en-GB");
        ModelState.SetModelValue("ManufacturerId", 
                                 new ValueProviderResult((object)oldData.ManufacturerId, 
                                     oldData.ManufacturerId.ToString(), myCulture));
    
        return View(oldData);
    }
    

    【讨论】:

    • 这行得通,但为什么会这样呢?为什么不将新更改的模型传递给视图工作?
    • 我认为当您返回值时,HtmlHelpers 从 ModelState 获取模型值,而不是模型本身。
    猜你喜欢
    • 2018-07-17
    • 2012-10-10
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多