2013-11-14 59 views
1

我的工作有使用VIN解码器来获得汽车信息的选项的应用程序。您可以在VIN输入,也可以通过下拉菜单,制造商,年份,牌子,型号等DropDownListFor并不总是显示所选值

制造商下拉是初始化页面上,没有选择的值的唯一选择。选择制造商将查找该制造商的所有可用年限并返回年份列表,并返回制造商列表和选定的制造商列表。然后选择一年将返回可用制造商列表,年份并使选定的制造商和选定的年份都得到识别,等等。

这个工作流程工作正常,我所有的下拉菜单中正确显示。但是,当输入一个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

如果您需要设置一个值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); 
} 
+0

这样的作品,但为什么它的工作原理呀?为什么不将新更改的模型传递给视图工作? – Belizzle

+1

我想当你返回值时,HtmlHelpers从ModelState获取模型值,而不是模型本身。 – Kaf