DropDownListFor并不总是显示选定的值

时间:2013-11-14 16:23:21

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

我正在开发一个可以选择使用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()中设置ManufacturerId,那么我的下拉列表会正确显示所选的任何制造商。如果在后期响应中设置了它,则下拉列表会显示所有正确的选项,但未选择正确的制造商。如果你查看视图,我实际上让它向我显示manufacturerId以确保它正确地获取数据,并且manufacturerId被设置为列表中的值,但它未被选中。

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

导致此内容无法正确呈现的原因是什么?

1 个答案:

答案 0 :(得分: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);
}