2015-03-20 3 views
0

Я пытаюсь отобразить 2 поля из моей модели INV_Locations в SelectList: location_dept|location_room или, например, IT|Storage. Использование THIS поста я кусочкам ниже вместе с помощью ViewData:Объединить 2 поля структуры Entity Framework в 1 SelectList?

INV_AssetsController - Edit() GET:

public async Task<ActionResult> Edit(int id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     INV_Assets iNV_Assets = await db.INV_Assets.FindAsync(id); 
     if (iNV_Assets == null) 
     { 
      return HttpNotFound(); 
     } 

     ViewBag.History = GetHistoryByAssetId(id); 

     ViewData["Location_Id"] = new SelectList((from l in db.INV_Locations.ToList() select new { location_room = l.location_dept + "|" + l.location_room }), "location_room", null, null); 
    } 

INV_AssetsController - Edit() HttpPost:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Edit([Bind(Include = "Id,Model_Id,Manufacturer_Id,Type_Id,Location_Id,Vendor_Id,Status_Id,ip_address,mac_address,note,owner,cost,po_number,description,invoice_number,serial_number,asset_tag_number,acquired_date,disposed_date,created_date,created_by,modified_date,modified_by")] INV_Assets iNV_Assets) 
    { 
     if (ModelState.IsValid) 
     { 
      iNV_Assets.modified_date = DateTime.Now; 
      iNV_Assets.modified_by = System.Environment.UserName; 
      db.Entry(iNV_Assets).State = EntityState.Modified; 
      await db.SaveChangesAsync(); 
      return RedirectToAction("Index", "Home"); 
     } 
     ViewData["Location_List"] = new SelectList((from l in db.INV_Locations.ToList() select new { location_room = l.location_dept + "|" + l.location_room }), "location_room", null, null); 
     return View(iNV_Assets); 
    } 

INV_Assets - Редактировать() Просмотр:

 <span class="control-label col-md-2">Location:</span> 
     <div class="col-md-4"> 
      @*@Html.DropDownList("Location_Id", null, htmlAttributes: new { @class = "form-control dropdown" })*@ 
      @Html.DropDownListFor(model => model.Location_Id, (SelectList)ViewData["Location_List"], htmlAttributes: new { @class = "form-control dropdown", @id = "selectLocation" }) 
      @Html.ValidationMessageFor(model => model.Location_Id, "", new { @class = "text-danger" }) 
     </div> 

Это близко, что делает (например.) Следующее в моем раскрывающемся списке:

{ location_room = IT|Server }, { location_room = IT|Storage } и т.д.

Кто-нибудь знает изменения синтаксиса мне нужно сделать для того, чтобы отображать только Соответствующая часть в списке выбора (IT|Server)?

ответ

1

Вы не указали объект dataTextField в конструкторе SelectList, поэтому по умолчанию используется метод анонимного объекта ToString(). Она должна быть: (обратите внимание, что последний параметр не требуется)

ViewData["Location_List"] = new SelectList((from l in db.INV_Locations.ToList() 
    select new { location_room = l.location_dept + "|" + l.location_room }), 
    "location_room", "location_room"); 

Боковые ноты:

  1. Ваш метод GET имеет ViewData["Location_Id"] (я предполагаю, что это опечатка и должно быть ViewData["Location_List"] (как в соответствии с методом POST )
  2. вы не показали свою модель, но Location_Id бы предложить свойство идентификатора (обычно int), поэтому я не знаю, как вы бы ожидать это работать. Вы привязываете текстовое значение «IT | Сервер» или «IT | Хранение» к объекту Location_Id, который, как я подозреваю, не имеет отношения к вашей модели или к полям базы данных . Я подозреваю, что вам действительно нужны здесь каскад ниспадающих списков, один для отдела, а второй для комнаты (связанной с Location_Id , который обновляется с помощью Ajax при выборе отдела.
  3. Я предлагаю вам повторно фактор генерации SelectList (и другие общий код) для частного метода, чтобы избежать дублирования кода.
  4. я настоятельно рекомендую вам научиться использовать вид модели и остановить смешение моделей ViewBag и ViewData и удалить этот ужасный [Bind(Include = "..")] атрибут
+0

Спасибо, Стивен. Я думаю, что у меня может возникнуть проблема, связанная с этим по другому вопросу: https://stackoverflow.com/questions/29212337/cannot-create-edit-record-due-to-validation. В прошлом я пытался выпустить два раза, но мне не нравилось использовать одну и ту же модель для заполнения двух разных списков выбора на основе двух разных полей (и я не хочу создавать отдельные таблицы/модели только для двух полей?). В настоящее время это все работает, кроме флажка подтверждения, в раскрывающемся списке, несмотря на то, что был сделан «действительный» выбор. –

+0

Я вижу, что вы приняли ответ на другой вопрос (который действительно относится к примечанию 2 выше), поэтому он принимает это сейчас. Но я все еще считаю, что вы делаете ужасный взлом, который даст вам будущие проблемы. Нет причин, по которым каскадные выпадения не будут работать. –