[英]SelectListItem not setting selected value
I have these classes. 我有这些课。
public class Store {
// constructor
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Stock> Stocks { get; set; }
}
public class Stock {
public int Id { get; set; }
public int StoreId { get; set; }
public int ProductId { get; set; }
public virtual Store Store { get; set; }
public virtual Product Product { get; set; }
}
public class Product {
// constructor
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Stock> Stocks { get; set; }
}
public class Order {
// constructor
public int Id { get; set; }
public virtual ICollection<OrderItem> OrderItems { get; set; }
}
public class OrderItem {
public int Id { get; set; }
public ICollection<Store> Stores { get; set; }
public Item Item { get; set; }
public Order Order { get; set; }
}
Fluid api: 流体API:
public class OrderItemMap : EntityTypeConfiguration<OrderItem> {
public OrderItemMap() {
HasMany(i => i.Stores)
.WithMany()
.Map(m => {
m.MapLeftKey("OrderItemId");
m.MapRightKey("StoreId");
m.ToTable("FromStore");
});
}
}
Now, for instance I have created an order and set my details and also the item's store as to where they should get the item to deliver it. 现在,例如,我创建了一个订单,并设置了我的详细信息以及商品的商店 ,以了解他们应从何处获取该商品以进行交付。 Note: An item can have many stores . 注意:一个项目可以有许多商店 。
My problem is.. If the user wants to Edit the order. 我的问题是..如果用户要编辑订单。 I don't know how to display the list of stores as dropdown and it's selected value. 我不知道如何将商店列表显示为下拉菜单及其选择的值。
Here's what I have done so far: 到目前为止,这是我所做的:
var order = _db.Orders.Find(orderId);
var orderVm = new EditOrderVm {
OrderId = order.Id,
OrderItems = order
.OrderItems
.Select(o => new EditOrderItemVm {
OrderItemId = o.Id,
OrderId = o.OrderId,
ProductId = o.ProductId,
Stores = (from sc in o.Product.Stocks
from st in o.Stores.DefaultIfEmpty()
select new {
Id = sc.Store.Id,
Name = sc.Store.Name
}).ToSelectList(s => s.Name, s => s.Id, s => true)
})
}
My VM: 我的虚拟机:
public class EditOrderItemVm {
// removed some for brevity
public IEnumerable<SelectListItem> Storses { get; set; }
}
My helper (ain't mine) 我的助手(不是我的)
public static IEnumerable<SelectListItem> ToSelectList<T, TTextProperty, TValueProperty>(this IEnumerable<T> instance, Func<T, TTextProperty> text, Func<T, TValueProperty> value, Func<T, bool> selectedItem = null)
{
return instance.Select(t => new SelectListItem
{
Text = Convert.ToString(text(t)),
Value = Convert.ToString(value(t)),
Selected = selectedItem != null && selectedItem(t)
});
}
My View: 我的观点:
@Model.OrderNumber
@foreach(var item in Model.OrderItems) {
@Html.DropDownListFor(model => item.StoreId, item.Stores, "Select store")
@Html.ValidationMessageFor(model => item.StoreId)
}
With the query above, I can populate the dropdown with the list of stores as to where the product is stored but i don't know how to set of what was selected during creation of order. 通过上面的查询,我可以在下拉列表中填充有关产品存储位置的商店列表,但是我不知道如何设置在创建订单时选择的商品。
It would be great if I can populate the dropdown with the list of stores as to where the item is stored and also set it's selected value. 如果可以在下拉列表中填充有关项目存储位置的商店列表,并设置其选定值,那就太好了。
This line should look like this, You have to take all your stores from db and select those who are involved in current order. 该行应如下所示:您必须从db中获取所有商店 ,然后选择当前订单中涉及的商店 。
var order = _db.Orders.Find(orderId);
var stores = _db.Stores; // take all stores from DB
var orderVm = new EditOrderVm {
OrderId = order.Id,
OrderItems = order
.OrderItems
.Select(o => new EditOrderItemVm {
OrderItemId = o.Id,
OrderId = o.OrderId,
ProductId = o.ProductId,
Stores = (from st in stores // all stores
select new {
Id = st.Id,
Name = st.Name
}).ToSelectList(
s => s.Name,
s => s.Id,
s => o.Stores.Any(sto => sto.Id == s.Id) //select only existing stores
)
})
}
您必须像s => s.Id == YOUR_CURRENT_STORE_Id
一样来代替s => true
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.