سلام استاد
من یه رکورد برای وضعیت سفارشم در جدول OrderDetail که به صورتEnum هست قراردادم که در بخش مدیریت وضعیتش عوض و به کاربر نشون بدم
مثلا 0 در حال پردزش
1 در حال پیگیری
2 تکمیل شده
3 ارسال شده
آیا این کار درسته؟
بهترین راه برای ویرایش همین مقدار enum از جدول به چه صورته؟
فقط یک رکورد میخوام آدیت بشه
سلام
بله مشکلی نداره
بهترین یا بدترین جحالت نداره دوست من ، نیاز تعیین میکنه
سلام استاد
من زمانی که میخوام ویرایش کنم ایتم رو انتخاب میکنم مقدار انتخاب شده از دراپ دوان خونده میشه موقع ویرایش رو دکمه کلیک میکنم این خطا رو میده بریک پونت هم میزارم اصلا نمیرسه به بریک پوینت در OnPost .
InvalidCastException: The field of type System.Decimal must be a string, array or ICollection type.متن خطا واضحه دوست من
من چیزی ور کست نکردم ؟؟؟؟
والا متوجه نشدم از خطاش ممکنه راهنمایی کنید.
بریک پوینت میزارم اصلا در متدOnPost وای نمیستده
سلام دوست عزیز
کاش کدهای Enum و ViweModel که ساختید رو گذاشته بودید تا بهتر میشد راهنماییتون کرد
همونطور که از خطا کاملا پیداست مشکل از Cast کردن اشتباهه ! اگه توی نوع ها باشه اجازه Build کردن بهتون نمیده و از اونجایی که میگید توی OnPost نمیره پس احتمالا برای Property هاتون یه Attribute نامرتبط استفاده کردید ! مثلا فرضا برای یه Property از جنس decimal اومدید MaxLenght تعریف کردید ! ViewModel رو بررسی کنید احتمالا مشکل از همون باشه
موفق باشید
سلام جناب حمیدی
کد های ویو مدل:
public class EditOrderDetail
{
public int OrderDetailId { get; set; }
public Datalayer.Entities.Order.OrderStatus OrderStatus { get; set; }
}
public enum OrderStatus
{
[Display(Name = "درحال پردازش")]
Processing = 0,
[Display(Name = "لغو شده ")]
Canceled = 1,
[Display(Name = "تحویل داده شده ")]
Delivered = 2
}
}
متدهای برای ویرایش و آپدیت اطلاعات:
OrderDetail GetOrderDetailById(int id);
EditOrderDetail EditOrderDetail(int orderDetailId);
void UpdateOrderDetail(EditOrderDetail editOrderDetail);Implement ها:
public EditOrderDetail EditOrderDetail(int orderDetailId)
{
return _context.OrderDetails.Where(od => od.DetailId == orderDetailId)
.Select(od => new EditOrderDetail()
{
OrderDetailId = od.DetailId,
OrderStatus = od.OrderStatus
}).Single();
}
public OrderDetail GetOrderDetailById(int id)
{
return _context.OrderDetails.Find(id);
}
public void UpdateOrderDetail(EditOrderDetail editOrderDetail)
{
var od = GetOrderDetailById(editOrderDetail.OrderDetailId);
editOrderDetail.OrderStatus = editOrderDetail.OrderStatus;
_context.OrderDetails.Update(od);
_context.SaveChanges();
}cshtml:
<div class="form-group row align-items-center m-b-0">
<label class="col-2 text-right control-label col-form-label"> وضعیت شفارش</label>
<div class="col-10 border-left p-b-10 p-t-10">
<select id="DestinationOptions" class="form-control" asp-for="OrderDetail.OrderStatus" asp-items="Html.GetEnumSelectList<OrderStatus>()"></select>
</div>
</div>
کدهای سمت ریزور:
private readonly IOrderService _orderService;
public EditOrderModel(IOrderService orderService)
{
_orderService = orderService;
}
[BindProperty]
public EditOrderDetail OrderDetail { get; set; }
public void OnGet(int id)
{
_orderService.GetOrderDetailById(id);
OrderDetail = _orderService.EditOrderDetail(id);
}
public IActionResult OnPost()
{
var od=new EditOrderDetail()
{
OrderDetailId = OrderDetail.OrderDetailId,
OrderStatus = OrderDetail.OrderStatus
};
_orderService.UpdateOrderDetail(od);
return RedirectToPage("Index");
}
}
}
هیچ خطایی نمیده ولی مقدار عوض نمیشه
Html.GetEnumSelectList<OrderStatus>()این کد بالا که توی ویو نوشتید چی هست و چی برمیگردونه ؟
همونطور که گفتم احتمالا از Attribute هایی هست که تعریف کردید ! تا جایی که یادمه آیتم های داخل Enum نمیتونن Display بگیرن و بجاش از Description استفاده میشه (البته شاید Display هم بگیرن !) اما درکل واسه نمایش دادنشون باید Extension بنویسید که بتونید نمایشش بدید.
پیشنهاد میکنم اول Display هارو بردارید و تست کنید اگه مشکل برطرف شد که همین موردی هس که گفتم اما اگه برطرف نشد باید مجددا همه موارد رو چک کنید
مشکل از یه جای دیگه بود حلش کردم ممنونم جناب حمیدی
مشکل از کجا بود ؟ یه توضیحی بدید
سلام جناب حمیدی عزیز
در بخش سرویس مربوط به ویرایش od.OrderStatus = editOrderDetail.OrderStatus; این قسمت به جای اینکه از ورودی بگیرم مقدارو od.OrderStatus رو با همین مقدار نوشته بودم که اشتباه بود و آپدیت نمیشد . در واقع از پارامتر ورودی متد نگرفته بودم این کد رو با کد های بالا مقایسه کنید.
بازم خیلی ممنونم که وقت گذاشتید .
public void UpdateOrderDetail(EditOrderDetail editOrderDetail)
{
var od = GetOrderDetailById(editOrderDetail.OrderDetailId);
od.OrderStatus = editOrderDetail.OrderStatus;
_context.OrderDetails.Update(od);
_context.Entry(od).State = EntityState.Modified;
_context.SaveChanges();
}بسیار هم عالی
موفق باشید