Я работаю над приложением MVC5 (Oracle DB) и заметил странное поведение с привязанным выпадающим списком в моем представлении. Когда я выбираю запись для редактирования, мое действие контроллера GET-Edit
загружает список имен из моего TBL_OWNERS
, отсортированных по [OWNER_NAME]
, в мой объект ViewData:
ViewData["Owner_List"] = new SelectList(db.TBL_OWNERS.OrderBy(x => x.OWNER_NAME), "ID", "OWNER_NAME");
Затем в своем представлении я использую этот список ViewData для заполнения SelectList, который заполняет DropDownListFor:
@Html.DropDownListFor(model => model.OWNER, (SelectList)ViewData["Owner_List"], "NONE", htmlAttributes: new { @class = "form-control dropdown", @id = "selectOwner" })
Теперь, когда я выбираю запись для редактирования, которая не имеет значения для [OWNER]
, я получаю ожидаемое значение по умолчанию «НЕТ» в качестве выбранного параметра в раскрывающемся списке. Однако, если у меня есть значение для [OWNER]
(например) «СМИТ, ДЖОН», при загрузке представления все еще отображается «НЕТ» в раскрывающемся списке.
Что так странно, так это то, что если я затем сохраню запись (указав ЛЮБОЕ имя из раскрывающегося списка), в следующий раз, когда я войду в свое представление редактирования для этой записи, раскрывающийся список уже предварительно выбран для правильного значения, уже сохраненного в Oracle ДБ.
Может ли кто-нибудь с большим опытом взвесить, что здесь происходит и как это исправить?
Для дополнительной информации (если это поможет) мой основной класс DAL имеет поле [OWNER]
, определенное как:
[StringLength(4000)]
public string OWNER { get; set; }
И затем у меня также есть класс MetaData для этого основного класса:
namespace Project.DAL
{
// This MetaData partial class is used to extend properties of the [ENT_COLLECTIONS] DAL class
// allowing for new properties to be set explicitly filled with related FK values.
[MetadataType(typeof(ENT_COLLECTIONSMD))]
public partial class ENT_COLLECTIONS
{
// .... Other MetaData Fields ...
[Display(Name = "Owner")]
public string Owner_Name
{
get
{
// TBL_OWNERS is not linked to ENT_COLLECTIONS like the other child tables (Locations, Types, etc.)
// Need to retrieve the [OWNER_NAME] from [ENT_OWNERS] to specify for [ENT_COLLECTIONS].[OWNER] instead of
// (ex.) "47" for the value.
// Band-Aid for Exporting where OWNER (ex.) "Smith, John" cannot be converted to a Decimal. If values is < 4 (ID), then proceed.
if (this.OWNER != null && this.OWNER.Length < 4)
{
// Convert the values of [ENT_COLLECTIONS].[OWNER] to decimal ("47" => 47)
var ownerID = Convert.ToDecimal(this.OWNER);
// Match this ID to [TBL_OWNERS].[ID] to get the singular referenced [TBL_OWNERS] entity.
var ownerEntity = db.TBL_OWNERS.FirstOrDefault(model => model.ID == ownerID);
// If a match was found, change [OWNER] from (ex.) "47" to "SMTIH, JOHN"
if (ownerEntity != null)
{
this.OWNER = ownerEntity.OWNER_NAME;
}
}
return this.OWNER;
}
}
}
public class ENT_COLLECTIONSMD
{
// ... Other Fields ...
[StringLength(4000)]
public string OWNER;
}
}
"ID", "OWNER_NAME"
помечается какCannot convert lambda expression to type 'object' becuase it is not a delegate type
?ENT_COLLECTIONS ent_Collections = await db.ENT_COLLECTIONS.FindAsync(id); ViewData["Owner_List"] = new SelectList(db.TBL_OWNERS.OrderBy(x => x.OWNER_NAME), "ID", "OWNER_NAME", x => x.OWNER_NAME == ent_Collections.OWNER);
Visual Studio помечает предложенное вами добавление как ошибку. 11.06.2015ViewData["Owner_List"] = new SelectList(db.INV_OWNERS.OrderBy(x => x.OWNER_NAME), "ID", "OWNER_NAME", ent_Collections.OWNER);
11.06.2015<input autocomplete="off">
в свое представление, и теперь я передаю [OwnerID] вместо [Owner_Name] для того нового параметра, который вы показали:decimal ownerID = db.INV_OWNERS.FirstOrDefault(x => x.OWNER_NAME == ent_Collections.OWNER).ID;
--ViewData["Owner_List"] = new SelectList(db.INV_OWNERS.OrderBy(x => x.OWNER_NAME), "ID", "OWNER_NAME", ownerID);
Все то же поведение, что и раньше. 11.06.2015int ownerID = 0; if (ent_Collections.OWNER != null) { ownerID = Convert.ToInt32(db.INV_OWNERS.FirstOrDefault(x => x.OWNER_NAME == ent_Collections.OWNER).ID); }
--ViewData["Owner_List"] = new SelectList(db.INV_OWNERS.OrderBy(x => x.OWNER_NAME), "ID", "OWNER_NAME", id = ownerID);
Точно такое же поведение, как и раньше. 11.06.2015