سلام دوست عزیز
وقت بخیر
به چه صورت می توانم یک DropDownList داینامیک ایجاد کنم که اطلاعاتش از طریق دیتابیس پر بشه
ممنون میشم راهنمایی بفرمایید
سلام
اول باید یه لیستی(یا IEnumrable یا ....) رو از طریق مدل یا ویودیتا یا ویوبگ یا .... به ویو بفرستین و بعد با حلقه ی فورایچ نمایش بدین
در این جا مثلا من با مدل فرستادم:
//بالای ویو
@model List<Person> <select name="persons">
@foreach(var item in Model)
{
<option value="@item.Id">@item.Name</option>
}
</select>اینطوری از دیتابیس پر میشن فقط توجه داشته باشید که اون ولیویی که من به تگ آپشن و name ئی که به تگ سلکت دادم برای ارسال فرم هست و اگه نباشه هم این دراپ داون نمایش داده میشه
سلام دوست من وقت بخیر
ممنون از دوستمون بابت پاسخگوییشون
همینطور که گفتن ابتدا لیستی که میخواید نمایش بدید رو داخل ViewBag یا ViewDate به صفحه ارسال کنید در ادامه
با استفاده از foreach اونرو داخل تگ select نمایش بدید
موفق باشید
سلام وقت بخیر
خیلی ممنون از توضیحات مفید شما دو بزرگوار
من دارم پروژه سایت خبری که با mvc نوشته شده رو با core بازنویسی می کنم و خیلی به مشکل برمی خورم یک نمونه مشکلDropDownList بود که توی core خود Scaffolding کدهای مربوط به DropDownList رو اضافه نمیکنه و مجبور میشیم خودمون کدهای معادل رو بنویسیم
1. من طبق توضیحات شما کدها رو اضافه کردم ولی مشکلی که هست اینه که زمان ذخیره اطلاعات در دیتابیس بجای مقدار آیتم انتخاب شده از DropDownList مقدار صفر در جدول ذخیره میشه 2. دوم اینکه در mvc برای باز کردن صفحات PageGroup در Modal یکسری کدها نوشته شد که همین کدها در core درست عمل نمیکنه، البته صفحه درون Modal باز میشه ولی خیلی خیلی سریع بسته میشه و همون صفحه معمول PageGroup به نمایش در میاد
خیلی ممنون می شم پاسخ این دو سوال رو بهم بدید
سلام مجدد
در مورد سوال اول فرض کنید لیستی از عنوان و ایدی دارید که داخل select نمایش میدید :
<select name="persons">
@foreach(var item in Model)
{
<option value="@item.Id">@item.Name</option>
}
</select>شما باید داخل ویو مدل صفحتون ایدی دریافت کنید که همون گزینه ای هست که قراره داخل select انتخاب شه :
prop int EntityIdحالا کافیه Select رو به ویو مدلتون متصل کنید و سمت controller دریافتش کنید :
<select asp-for="EntityId">
@foreach(var item in Model)
{
<option value="@item.Id">@item.Name</option>
}
</select>در مورد سوال دوم هم مشکل از js و script هاتون هست بررسی کنید یا توی js خودتون debugger بزارید احتمالا مشکلتون مشخص میشه
موفق باشید
سلام وقت به خیر
خیلی ممنون از راهنمایی های ارزشمندتون
با توجه به توضیحاتی که فرمودید مشکل نمایش اطلاعات DropDownList در ویو Create و Edite و ذخیره مقدار آن در دیتابیس رفع شد
ولی همچنان با مشکل نمایش اطلاعات DropDownList در ویو index مواجه هستم
کدی که خود Scaffolding برای ویو index از جدول Page(خبر) اضافه میکنه به این صورت هست
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.GroupId)
</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.GroupId)
</td>
</tr>
}
</tbody>
</table>این خط کد را
@Html.DisplayNameFor(model => model.GroupId)به این صورت تغییر میدم (از طریق رابطه جدول Page وارد میشم) ولی مقدار GroupTitle نال هست و چیزی نمایش داده نمیشه
@Html.DisplayNameFor(model => model.PageGroup.GroupTitle)سلام وقت بخیر
میشه لطفا راهنمایی بفرمایید
سلام مجدد وقت بخیر
جایی که دارید به دیتابیس query میزنید باید PageGroup رو Include کنید مثلا :
_context.Pages.Include(s => s.PageGroup).ToList()موفق باشید
سلام مجدد
همین کار رو انجام دادم ولی متاسفانه همچنان مقدار null رو برمیگردونه
روابط جداولم هم درست هست
public virtual PageGroup PageGroup { get; set; }ولی زمانی که کدها رو trace میکنم مقادیر جدول PageGroup نال هست
نمیدونم مشکل از کجاست
سلام مجدد
با مواردی که مطرح کردیم باید به درستی کار کنه
از بخش های مرتبط عکس بفرستید بررسی کنیم
بله چشم
کد مربوط به اکشن Index
public async Task<IActionResult> Index()
{
return View(await _context.Page.Include(p => p.PageGroup).ToListAsync());
}
کد مربوط به ویو Index
@model IEnumerable<MyCms.Models.Page>
@{
ViewData["Title"] = "Index";
Layout = "~/Areas/Admin/Views/Shared/_AdminLayout.cshtml";
}
<h2>Index</h2>
<p>
<a asp-action="Create">Create New</a>
</p>
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.PageGroup.GroupTitle)
</th>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.ShortDescription)
</th>
<th>
@Html.DisplayNameFor(model => model.Text)
</th>
<th>
@Html.DisplayNameFor(model => model.Visit)
</th>
<th>
@Html.DisplayNameFor(model => model.ImageName)
</th>
<th>
@Html.DisplayNameFor(model => model.ShowSlider)
</th>
<th>
@Html.DisplayNameFor(model => model.CreateDate)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.PageGroup.GroupTitle)
</td>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.ShortDescription)
</td>
<td>
@Html.DisplayFor(modelItem => item.Text)
</td>
<td>
@Html.DisplayFor(modelItem => item.Visit)
</td>
<td>
<img src="~/Images/Page/@item.ImageName" class="thumbnail" style
</td>
<td>
@Html.DisplayFor(modelItem => item.ShowSlider)
</td>
<td>
@Html.DisplayFor(modelItem => item.CreateDate)
</td>
<td>
<a asp-action="Edit" asp-route-id="@item.PageId">Edit</a> |
<a asp-action="Details" asp-route-id="@item.PageId">Details</a> |
<a asp-action="Delete" asp-route-id="@item.PageId">Delete</a>
</td>
</tr>
}
</tbody>
</table>
کد مربوط به مدل Page
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
namespace MyCms.Models
{
public class Page
{
[Key]
public int PageId { get; set; }
[Display(Name = "گروه خبری")]
[Required(ErrorMessage = "لطفا {0} را وارد کنید")]
public int GroupId { get; set; }
[Display(Name = "عنوان")]
[Required(ErrorMessage = "لطفا {0} را وارد کنید")]
[MaxLength(200, ErrorMessage = "{0} نمی تواند بیشتر از {1} کاراکتر باشد")]
public string Title { get; set; }
[Display(Name = "توضیح مختصر")]
[Required(ErrorMessage = "لطفا {0} را وارد کنید")]
[DataType(DataType.MultilineText)]
public string ShortDescription { get; set; }
[Display(Name = "متن")]
[Required(ErrorMessage = "لطفا {0} را وارد کنید")]
[DataType(DataType.MultilineText)]
public string Text { get; set; }
[Display(Name = "بازدید")]
public int Visit { get; set; }
[Display(Name = "تصویر")]
public string ImageName { get; set; }
[Display(Name = "اسلایدر")]
public bool ShowSlider { get; set; }
[Display(Name = "تاریخ ثبت")]
[DisplayFormat(DataFormatString = "{0: yyyy/MM/dd}")]
public DateTime CreateDate { get; set; }
#region Relations
public virtual PageGroup PageGroup { get; set; }
public virtual List<PageComment> PageComment { get; set; }
#endregion
}
}
خطای شما در این خط هستش
<th>
@Html.DisplayNameFor(model => model.PageGroup.GroupTitle)
</th>مدل صفحه شما لیستی از دسته Page هست
پس برای دسترسی به آیتم هاش باید داخل foreach بزارید همینطور که پایین تر استفاده کردید
در نظر داشته باشید که شما داخل هر ایتم از لیستی که به صفحه ارسال میکنید PageGroup رو دارید
توسط لیست اصلی به PageGroup دسترسی ندارید پس model.PageGroup اصلا وجود نداره
اونجایی که دارید نمایش میدید اسم ستون نمایشی جدولتون هست
پاکش کنید و بجاش مثلا بنویسید عنوان دسته بندی
موفق باشید
ممنون از توضیحات تون
ولی عنوان نمایشی رو درست نشون میده
مشکل من در قسمت تگ هلپر DisplayNameFor نیست بلکه تگ هلپر DisplayFor هست که مقداری که از دیتابیس خونده میشه رو در اینجا به نمایش در نمیاره
به جای کد زیر چی باید بنویسم؟
@Html.DisplayFor(modelItem => item.PageGroup.GroupTitle)
همین کدهایی که خدمت تون ارسال کردم در mvc درست کار میکنه ولی در core مشکل دار شده
میتونید به این شکل بنویسید نیاز نیست حتما DisplayFor باشه :
@item.PageGroup.GroupTitle
سلام
ببخشید از طریق دستور زیر باید به فیلد ها و مقادیر جدول PageGroup هم دسترسی داشته باشم، درسته؟
var pages = _context.Page.Include(p => p.PageGroup).ToList();پس چرا با این دستور جدول PageGroup رو Null برمیگردونه؟
روابط بین جداول Page و PageGroup هم برقرار هست
public virtual PageGroup PageGroup { get; set; }علتش میتوند ایراد از نصب پکیج هام باشه؟
این پکیج ها رو نصب کردم
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="5.0.17">
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.17">
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.17">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.17">
ظاهرا روابطی که بین جداولم در Model در نظر گرفتم رو اصلا تشخیص نمیده
من برای بعضی از صفحاتم نیاز دارم که از طریق روابط وارد بشم و به فیلدهای مورد نظر دسترسی پیدا کنم
نمیتونم که هر سری ViewMode بسازم
لطفا بهم کمک کنید که این مشکل حل بشه
سلام خدمت دوستان عزیز
من دو مدل Page و PageGroup رو خدمت تون ارسال می کنم
لطفا اگه براتون مقدور هست از طریق Scaffolding کنترولرها و ویوهای مورد نظر رو بسازید
متوجه خواهید شد که در جاهایی که نیاز هست از طریق روابط جداول وارد شویم تا به بعضی از فیلدها دسترسی داشته باشیم این عمل اتفاق نمیفته و داده ها Null برگردانده میشن
لطفا چک بفرمایید و در صورتی که جواب گرفتید بنده رو راهنمایی بفرمایید
با سپاس فراوان
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace MyCms.Models
{
public class Page
{
[Key]
public int PageId { get; set; }
[Display(Name = "گروه خبری")]
[Required(ErrorMessage = "لطفا {0} را وارد کنید")]
public int GroupId { get; set; }
[Display(Name = "عنوان")]
[Required(ErrorMessage = "لطفا {0} را وارد کنید")]
[MaxLength(200, ErrorMessage = "{0} نمی تواند بیشتر از {1} کاراکتر باشد")]
public string Title { get; set; }
[Display(Name = "توضیح مختصر")]
[Required(ErrorMessage = "لطفا {0} را وارد کنید")]
[DataType(DataType.MultilineText)]
public string ShortDescription { get; set; }
[Display(Name = "متن")]
[Required(ErrorMessage = "لطفا {0} را وارد کنید")]
[DataType(DataType.MultilineText)]
public string Text { get; set; }
[Display(Name = "بازدید")]
public int Visit { get; set; }
[Display(Name = "تصویر")]
public string ImageName { get; set; }
[Display(Name = "اسلایدر")]
public bool ShowSlider { get; set; }
[Display(Name = "تاریخ ثبت")]
[DisplayFormat(DataFormatString = "{0: yyyy/MM/dd}")]
public DateTime CreateDate { get; set; }
#region Relations
public virtual PageGroup PageGroup { get; set; }
#endregion
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace MyCms.Models
{
public class PageGroup
{
[Key]
public int GroupId { get; set; }
[Display(Name = "عنوان گروه")]
[Required(ErrorMessage = "لطفا {0} را وارد کنید")]
[MaxLength(200, ErrorMessage = "{0} نمی تواند بیشتر از {1} کاراکتر باشد")]
public string GroupTitle { get; set; }
#region Relations
public virtual List<Page> Page { get; set; }
#endregion
}
}
سلام وقت بخیر
مدلتون رو به این شکل تغییر بدید و مجدد migration بزنید
مدل Page از :
public virtual PageGroup PageGroup { get; set; }به :
public virtual PageGroup Group { get; set; }موفق باشید
سلام مجدد
مشکل رفع شد
بی نهایت سپاسگزارم از وقتی که گذاشتید
پس می تونیم بگیم که کلمه PageGroup از کلمات رزرو شده .Net Core هست که استفاده از اون باعث این ایرادات شده؟
سلام مجدد
خیر اینطور نیست
وقتی که شما Id خودتون رو به این شکل تعریف می کنید :
public int GroupId { get; set; }برای Relation به جدول مورد نظر اگر از اسم Group استفاده کنید (که اسم همون GroupId منهای کلمه ی Id هست) خودش متوجه میشه که این ForeignKey مربوط به GroupId میشه و Relation شما به درستی زده میشه
اما اگر اسم دیگه ای مثلا PageGroup بزارید خودتون باهاش بهش بگید به این شکل :
[ForeignKey("GroupId")]
public virtual PageGroup PageGroup { get; set; }که متوجه بشه این ForeignKey مربوط به GroupId میشه
موفق باشید
سپاس فراوان
در پناه حق موفق و موید باشید