2013-11-14 4 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); 
} 

Если я установил ManufacturerId в Temp(), то мой раскрывающийся список будет корректно отображаться независимо от выбранного производителя. Если он задан в ответном сообщении, то раскрывающийся список отображает все правильные параметры, но без правильного выбора производителя. И если вы посмотрите в представлении, я на самом деле его показываю, что у меня есть файл 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

Смежные вопросы