سلام. من تازه برنامه نویسی رو شروع کردم و دارم یک وبسایت میسازم برای تست مهارتای خودم. الان دارم یه سایت فروشگاهی میسازم و یکسری از بخش هاش کامل شده ولی الان تو قسمت جزییات محصول گیر کردم. مشکلم اینه که آی دی محصول رو میگیرم و موقعی که کنترلر میخواد دریافتش کنه آی دی 0 رو میفرسته. واس بقیه قسمت ها همچین چیزی رو پیاده سازی کرده بودم ولی همچین مشکلی نداشتن.
کد هام=
سرویس دریافت جزییات محصول:
namespace Store.Application.Services.Products.Queries.GetProductDetailForSite
{
public interface IGetProductDetailForSiteService
{
ResultDto<ProductDetailForSiteDto> Execute(long Id);
}
public class GetProductDetailForSiteService : IGetProductDetailForSiteService
{
private readonly IDatabaseContext _context;
public GetProductDetailForSiteService(IDatabaseContext context)
{
_context = context;
}
public ResultDto<ProductDetailForSiteDto> Execute(long Id)
{
var product = _context.Products
.Include(p => p.Category)
.ThenInclude(p => p.ParentCategory)
.Include(p => p.ProductImages)
.Include(p => p.ProductFeatures)
.Where(p => p.Id == Id).FirstOrDefault();
if (product == null)
{
throw new Exception("Product Not Found.....");
}
return new ResultDto<ProductDetailForSiteDto>()
{
Data = new ProductDetailForSiteDto
{
Brand = product.Brand,
Category = $"{product.Category.ParentCategory.Name} - {product.Category.Name}",
Description = product.Description,
Id = product.Id,
Price = product.Price,
Title = product.Name,
Images = product.ProductImages.Select(p => p.Src).ToList(),
Features = product.ProductFeatures.Select(p => new ProductDetailForSite_FeaturesDto
{
DisplayName = p.DisplayName,
Value = p.Value
}).ToList(),
},
IsSuccess = true,
};
}
}
public class ProductDetailForSiteDto
{
public long Id { get; set; }
public string Title { get; set; }
public int Price { get; set; }
public string Category { get; set; }
public string Brand { get; set; }
public string Description { get; set; }
public List<ProductDetailForSite_FeaturesDto> Features { get; set; }
public List<string> Images { get; set; }
}
public class ProductDetailForSite_FeaturesDto
{
public string DisplayName { get; set; }
public string Value { get; set; }
}
}
کنترلر :
namespace EndPoint.Web.Controllers
{
public class ProductController : Controller
{
private readonly IProductFacad _productFacad;
public ProductController(IProductFacad productFacad)
{
_productFacad = productFacad;
}
public IActionResult Index(int Page = 1)
{
return View(_productFacad.GetProductForSiteService.Execute(Page).Data);
}
[HttpGet]
public IActionResult Detail(long Id)
{
return View(_productFacad.GetProductDetailForSiteService.Execute(Id).Data);
}
}
}
صفحه اصلی قسمت محصولات :
<div class="products-grid clearfix row-fluid">
@foreach (var item in Model.Products)
{
<div class="product fl">
<div class="product-preview">
<img src="~/@item.ImageSrc" alt="product" style="display: inline-block; width: 206px;">
</div>
<div class="product-info" style="height: 90px;">
<h5>
<a href="~/product/Detail/@item.Id"> @item.Title </a>
</h5>
<h4 class="fl">@item.Price.ToString("n0") <span style="text-decoration : none; color :black">تومان</span></h4>
<div class="button-box fr" style="opacity: 0;">
<div>
<i class="icon-shopping-cart"></i>
<span>افزودن به سبد خرید</span>
</div>
<div>
<i class="icon-refresh"></i>
</div>
<div>
<i class="icon-heart"></i>
</div>
</div>
</div>
<div class="product-rating">
<div class="stars">
<span class="star"></span><span class="star"></span><span class="star"></span><span class="star"></span><span class="star"></span>
</div>
</div>
</div>
}
</div>
<div class="clearfix">
<ul class="products-pagination fr">
<li><i class="icon-caret-right"></i></li>
<li class="active">1</li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li>...</li>
<li><a href="#">99</a></li>
<li><a href="#"><i class="icon-caret-left"></i></a></li>
</ul>
</div>
</div>
با بریک پوینت پروژه رو تریس کردم و دیدم که وقتی روی محصول کلیک میکنم آی دی رو به کنترلر میفرسته و همه چیز درست پیش میره ولی بعدش یکبار دیگه این کار رو انجام میده و این دفعه آی دی 0 رو میفرسته و پروژه ارور میده. من الان نمیدونم چرا یکبار دیگه همهی مراحل طی میشه و آی دی 0 رو میفرسته.
دستوری که شما برای ارسال اطلاعات به سمت کنترلر نوشتید این هست :
<a href="~/product/Detail/@item.Id"> @item.Title </a>
به نظرم بهتره از TagHelper ها استفاده کنید. چون شما دارید از Asp.net Core استفاده می کنید و امکانات خوبی در این رابطه داره. می تونید به صورت زیر بنویسید دستور خودتون رو
<a asp-controller="Product" asp-action="Detail" asp-route-Id="@item.Id">@item.Title</a>
اگر هم نمی خواید از TagHelper ها استفاده کنید بهتره با توجه به Routing تعریف شده در کلاس startup.cs عمل کنید. یعنی به این شکل
<a href="~/product/Detail?Id=@item.Id"> @item.Title </a>
مشکل از Layout بود. من تجربه frontend ندارم و نمیدونم چجوری همچین اتفاقی میافتاد ولی layout رو یه بار دیگه ساختم و مشکل درست شد.
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
75
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
109
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1033
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
428
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1356
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4797
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
214
- پاسخ :
1
|
تاریخ :
1403/07/26
- ساعت :
09:00:00 PM
- بازدید :
117
- پاسخ :
0
|
تاریخ :
1403/05/16
- ساعت :
09:57:00 AM
- بازدید :
396
- پاسخ :
2
|
تاریخ :
1403/06/25
- ساعت :
11:39:00 PM
- بازدید :
567
- پاسخ :
1
|
تاریخ :
1401/02/24
- ساعت :
02:17:00 PM
- بازدید :
2008
- پاسخ :
1
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
75
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
109
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1033
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
428
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
930
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1356
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4797
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1160
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
597
- پاسخ :
1
|