2015-07-27 3 views
0

Мой домашний контроллер выглядит следующим образомПочему я получаю идентификатор вместо текста из раскрывающегося списка?

public ActionResult Index() 
{ 
    List<District> allDistrict = new List<District>(); 
    List<Tehsil> allTehsil = new List<Tehsil>(); 
    List<SubTehsil> allSubTehsil = new List<SubTehsil>(); 
    using (FarmerBDContext db = new FarmerBDContext()) 
    { 
     allDistrict = db.Districts.ToList(); 
    } 
    ViewBag.DistrictId = new SelectList(allDistrict, "DistrictId", "DistrictName"); 
    ViewBag.TehsilId = new SelectList(allTehsil, "TehsilId", "Tehsilname"); 
    ViewBag.SubTehsilId = new SelectList(allSubTehsil, "SubTehsilId", "SubTehsilName"); 
    return View(); 
} 

Мой район, Tehsil и SubTehsil выпадающий становятся заселена из другого класса модели.

Район класса

public int DistrictId { get; set; } 
public string DistrictName { get; set; } 
public virtual ICollection<Tehsil> tbTehsils { get; set; } 

Мой Tehsil И Subtehsil класс похожи, но имеют отношения/б их

Эта модель класса сильно типизированных к моей форме Index.cshtml

public string DistrictName { get; set; } 
public string TehsilName { get; set; } 
public string SubTehsilName { get; set; } 
.... // Other Fields 

И мой индекс выглядит так:

<table> 
    <tr> 
     <td class="editor-label Label"> 
      @Html.LabelFor(model => model.DistrictName) 
     </td> 
     <td> 
      @Html.DropDownList("DistrictName", (SelectList)@ViewBag.DistrictId, " -- Select District -- ", new { @class = "ddl"}) 
     </td> 
    </tr> 
    <tr> 
     <td></td> 
     <td class="editor-field"> 
      @Html.ValidationMessageFor(model => model.DistrictName) 
     </td> 
    </tr> 
    <tr> 
     <td class="editor-label Label"> 
      @Html.LabelFor(model => model.TehsilName) 
     </td> 
     <td> 
      @Html.DropDownListFor(model => model.TehsilName, @ViewBag.TehsilId as SelectList, "Select Tehsil", new { @class = "ddl" }) 
     </td> 
    </tr> 
    <tr> 
     <td></td> 
     <td class="editor-field"> 
      @Html.ValidationMessageFor(model => model.TehsilName) 
     </td> 
    </tr> 
    .... 
</table> 

<p> 
    <input type="submit" value="Details" /> 
</p> 

Я обращаюсь к ним в другом контроллере, подобном этому, который основан на моих свойствах модели.

ViewBag.DistrictName = model.DistrictName; 
ViewBag.TehsilName = model.TehsilName; 
ViewBag.SubTehsilName = model.SubTehsilName; 

Я также попытался доступа текст выпадающего списка, используя имя DropDownList

Request.Form["DistrictName"].ToString() 

и даже использовали

FormCollection form 

Еще одна вещь, следует отметить, что, когда я использую простой

<select> 
<option id=1>Abc</option> 
</select> 

Я получаю g Текст, который является абс.

+0

Показать код действия POST, которое вы вызываете. –

+0

Пожалуйста, укажите только код, имеющий отношение к вашему вопросу. См. [Как создать минимальный, полный и проверенный пример] (http: // stackoverflow.com/help/mcve) –

+0

Спасибо, Стивен, я помню это – lokopi

ответ

4

Поскольку тег <select> отправляет обратно атрибут value по своему выбору. You использование

ViewBag.DistrictId = new SelectList(allDistrict, "DistrictId", "DistrictName"); 

означает, что ваши варианты генерации, которые имеют value атрибут равен DistrictId свойству District. Если вы осмотрите HTML ваших генерирующие вы увидите (если у вас коллекция содержит new District() { DistrictId = 1, DistrictName = "ABC" }; и new District() { DistrictId = 2, DistrictName = "XYZ" };)

<select name="DistrictName" ...> 
    <option value="1">ABC</option> 
    <option value="2">XYZ</option> 
</select> 

Если вы хотите, чтобы значение DistrictName имущества быть привязанными к вашей модели, то она должна быть

ViewBag.DistrictId = new SelectList(allDistrict, "DistrictName", "DistrictName"); 

в качестве альтернативы вы можете сделать

IEnumerable<string> allDistrict = db.Districts.Select(d => d.DistrictName); 
ViewBag.DistrictId = new SelectList(allDistrict); // a more appropriate name might be ViewBag.DistrictList 

Side примечание: HTML таблица элементов для табличных данных, а не макет!

+0

Большое спасибо – lokopi

+0

Тогда придерживайтесь своего исходного кода, который добавляет 'ID' как свойство' Value' 'SelectListItem', но меняет ваше свойство на' public int AreaName {get; задавать; } '- Почему вы просите вернуть« Имя », когда на самом деле вы хотите« ID », как у вас уже есть? (и если они каскадируют, то второй и третий 'SelectList' должны быть' new SelectList (Enumerable.Empty ()); ' –

+0

Я показываю форму на следующей странице, поэтому я хочу показать текстовое поле – lokopi

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