• 1401/03/03

چگونگی ساخت dropDownList داینامیک در asp.net core :

سلام دوست عزیز

وقت بخیر

به چه صورت می توانم یک DropDownList داینامیک ایجاد کنم که اطلاعاتش از طریق دیتابیس پر بشه

ممنون میشم راهنمایی بفرمایید

  • 1401/03/03
  • ساعت 16:18

سلام

اول باید یه لیستی(یا IEnumrable یا ....) رو از طریق مدل یا ویودیتا یا ویوبگ یا .... به ویو بفرستین و بعد با حلقه ی فورایچ نمایش بدین

در این جا مثلا من با مدل فرستادم:

//بالای ویو
@model List<Person>
  <select name="persons">
  @foreach(var item in Model)
  {
    <option value="@item.Id">@item.Name</option>
  }
  </select>

اینطوری از دیتابیس پر میشن فقط توجه داشته باشید که اون ولیویی که من به تگ آپشن و name ئی که به تگ سلکت دادم برای ارسال فرم هست و اگه نباشه هم این دراپ داون نمایش داده میشه


  • 1401/03/03
  • ساعت 21:31

سلام دوست من وقت بخیر

ممنون از دوستمون بابت پاسخگوییشون

همینطور که گفتن ابتدا لیستی که میخواید نمایش بدید رو داخل ViewBag یا ViewDate به صفحه ارسال کنید در ادامه 

با استفاده از  foreach اونرو داخل تگ select نمایش بدید

موفق باشید


  • 1401/03/05
  • ساعت 03:13

سلام وقت بخیر

خیلی ممنون از توضیحات مفید شما دو بزرگوار

من دارم پروژه سایت خبری که با mvc نوشته شده رو با core بازنویسی می کنم و خیلی به مشکل برمی خورم یک نمونه مشکلDropDownList بود که توی core خود Scaffolding کدهای مربوط به DropDownList رو اضافه نمیکنه و مجبور میشیم خودمون کدهای معادل رو بنویسیم

1. من طبق توضیحات شما کدها رو اضافه کردم ولی مشکلی که هست اینه که زمان ذخیره اطلاعات در دیتابیس بجای مقدار آیتم انتخاب شده از DropDownList مقدار صفر در جدول ذخیره میشه 2. دوم اینکه در mvc برای باز کردن صفحات PageGroup در Modal یکسری کدها نوشته شد که همین کدها در core درست عمل نمیکنه، البته صفحه درون Modal باز میشه ولی خیلی خیلی سریع بسته میشه و همون صفحه معمول PageGroup به نمایش در میاد

خیلی ممنون می شم پاسخ این دو سوال رو بهم بدید


  • 1401/03/05
  • ساعت 09:49

سلام مجدد

در مورد سوال اول فرض کنید لیستی از عنوان و ایدی دارید که داخل 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 بزارید احتمالا مشکلتون مشخص میشه

موفق باشید


  • 1401/03/09
  • ساعت 03:24

سلام وقت به خیر

خیلی ممنون از راهنمایی های ارزشمندتون

با توجه به توضیحاتی که فرمودید مشکل نمایش اطلاعات 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)

  • 1401/03/09
  • ساعت 14:54

سلام وقت بخیر

میشه لطفا راهنمایی بفرمایید


  • 1401/03/09
  • ساعت 16:18

سلام مجدد وقت بخیر

جایی که دارید به دیتابیس query میزنید باید PageGroup رو Include کنید مثلا :

_context.Pages.Include(s => s.PageGroup).ToList()

موفق باشید

 


  • 1401/03/10
  • ساعت 19:36

سلام مجدد

همین کار رو انجام دادم ولی متاسفانه همچنان مقدار null رو برمیگردونه

روابط جداولم هم درست هست

 public virtual PageGroup PageGroup { get; set; }

ولی زمانی که کدها رو trace میکنم مقادیر جدول PageGroup نال هست

نمیدونم مشکل از کجاست


  • 1401/03/10
  • ساعت 21:56

سلام مجدد 

با مواردی که مطرح کردیم باید به درستی کار کنه

از بخش های مرتبط عکس بفرستید بررسی کنیم


  • 1401/03/10
  • ساعت 22:15

بله چشم

کد مربوط به اکشن 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
    }
}

 

 

 


  • 1401/03/10
  • ساعت 22:32

خطای شما در این خط هستش

<th>
                @Html.DisplayNameFor(model => model.PageGroup.GroupTitle)
            </th>

مدل صفحه شما لیستی از دسته Page هست

پس برای دسترسی به آیتم هاش باید داخل foreach بزارید همینطور که پایین تر استفاده کردید

در نظر داشته باشید که شما داخل هر ایتم از لیستی که به صفحه ارسال میکنید PageGroup رو دارید 

توسط لیست اصلی به PageGroup دسترسی ندارید پس model.PageGroup اصلا وجود نداره

اونجایی که دارید نمایش میدید اسم ستون نمایشی جدولتون هست

پاکش کنید و بجاش مثلا بنویسید عنوان دسته بندی

موفق باشید


  • 1401/03/10
  • ساعت 23:22

ممنون از توضیحات تون

ولی عنوان نمایشی رو درست نشون میده

مشکل من در قسمت تگ هلپر DisplayNameFor نیست بلکه تگ هلپر  DisplayFor هست که  مقداری که از دیتابیس خونده میشه رو در اینجا به نمایش در نمیاره

به جای کد زیر چی باید بنویسم؟

  @Html.DisplayFor(modelItem => item.PageGroup.GroupTitle)

 


  • 1401/03/11
  • ساعت 00:16

همین کدهایی که خدمت تون ارسال کردم در mvc درست کار میکنه ولی در core مشکل دار شده


  • 1401/03/11
  • ساعت 22:25

میتونید به این شکل بنویسید نیاز نیست حتما DisplayFor باشه :

@item.PageGroup.GroupTitle

 


  • 1401/03/12
  • ساعت 02:13

سلام

ببخشید از طریق دستور زیر باید به فیلد ها و مقادیر جدول 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">

  • 1401/03/12
  • ساعت 02:21

ظاهرا روابطی که بین جداولم  در Model در نظر گرفتم رو اصلا تشخیص نمیده

من برای بعضی از صفحاتم نیاز دارم که از طریق روابط وارد بشم و به فیلدهای مورد نظر دسترسی پیدا کنم

نمیتونم که هر سری ViewMode بسازم

لطفا بهم کمک کنید که این مشکل حل بشه

 


  • 1401/03/14
  • ساعت 00:40

سلام خدمت دوستان عزیز

من دو مدل 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
    }
}

  • 1401/03/14
  • ساعت 01:24

سلام وقت بخیر 

مدلتون رو به این شکل تغییر بدید و مجدد migration بزنید

مدل Page از  :

public virtual PageGroup PageGroup { get; set; }

به :

public virtual PageGroup Group { get; set; }

موفق باشید

 


  • 1401/03/14
  • ساعت 18:05

سلام مجدد

مشکل رفع شد

بی نهایت سپاسگزارم از وقتی که گذاشتید

پس می تونیم بگیم که کلمه PageGroup از کلمات رزرو شده .Net Core هست که استفاده از اون باعث این ایرادات شده؟

 


  • 1401/03/14
  • ساعت 19:02

سلام مجدد

خیر اینطور نیست 

وقتی که شما Id خودتون رو به این شکل تعریف می کنید :

public int GroupId { get; set; }

برای Relation به جدول مورد نظر اگر از اسم Group استفاده کنید (که اسم همون GroupId منهای کلمه ی Id هست) خودش متوجه میشه که این ForeignKey مربوط به GroupId میشه و Relation شما به درستی زده میشه

اما اگر اسم دیگه ای مثلا PageGroup بزارید خودتون باهاش بهش بگید به این شکل :

[ForeignKey("GroupId")]
public virtual PageGroup PageGroup { get; set; }

که متوجه بشه این ForeignKey مربوط به GroupId میشه

موفق باشید


  • 1401/03/14
  • ساعت 20:26

سپاس فراوان

در پناه حق موفق و موید باشید