我正在开发一个可以选择使用VIN解码器获取汽车信息的应用程序。您可以输入VIN,也可以通过下拉菜单,制造商,年份,品牌,型号等进行选择。
制造商下拉列表是唯一在页面上初始化的内容,没有选定的值。选择制造商将查找该制造商的所有可用年份并返回年份列表,以及返回制造商列表和所选的制造商列表。选择一年将返回可用制造商列表,年份和品牌,所选制造商和选定年份均已确定,依此类推,直至申请。
此工作流程正常,我的所有下拉列表都能正确显示。虽然输入了VIN,但我已经为每个选择了值,并且仍然可以找到可用选项的列表,并且如果有人手动选择了选项,那么就像我一样呈现页面。当我执行此操作时,除了制造商之外,所有下拉菜单都使用正确的选定属性正确呈现。
我试图尽可能地隔离它,并且已经剥夺了其他所有东西,我现在就拥有它:
查看:
@model My_Project.Models.Data
@using System.Web.Helpers
@using (Html.BeginForm("Temp", "Home", FormMethod.Post, new { id = "formIndex" }))
{
<div>
VIN:
@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方法(我此时已经剥离了该功能),它将返回相同的模型,但也会正确呈现。
导致此内容无法正确呈现的原因是什么?
答案 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);
}