DropDownListFor并不总是表示选择的值(DropDownListFor not alwa

2019-10-18 23:43发布

我工作在具有使用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);
}

如果我在临时设置的ManufacturerId(),然后我的下拉列表中正确地选择任何厂家渲染。 如果在后响应设置虽然,在下拉列表呈现了所有正确的选项,但没有正确的制造商选择。 如果你在视图看,我其实有它显示manufacturerId给我,以确保它是正确获取数据,并manufacturerId设置为是在列表中的值,但它没有被选中。

我想不出有什么区别之间的这两个实例因为在渲染视图中使用的模型看上去是一样的。 最重要的是,如果该方法后,通过选择制造商(我在这一点上剥离出该功能)调用,它会返回相同的模型,但也正常显示。

什么是造成这种不正确呈现从职位的回报?

Answer 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);
}


文章来源: DropDownListFor not always showing selected value