من یک جدول دارم برای نمایش شهر و استان که اگر parentId=null باشد استان است. اگر برابر Id باشد شهر است . این متد های داخل ریپوزیتوری که ویو مدل آنرا پر میکند که فقط ،Title , LocationId دارد.
public async Task<List<UserLocationViewModel>> GetStateForUserInfo()
{
var state= await _context.Locations.Where(l => l.ParentId == null)
.Select(l => new UserLocationViewModel()
{
Title = l.Title,
LocationId = l.Id
}).ToListAsync();
return (state);
}
public async Task<List<UserLocationViewModel>> GetCityForUserInfo(long locationId)
{
var x= await _context.Locations.Where(l => l.ParentId == locationId)
.Select(l => new UserLocationViewModel()
{
Title = l.Title,
LocationId = l.Id
}).ToListAsync();
return x;
}
میخواهم بفرستم این رو به یک صفحه که خودش یه ویو ومدل دیگه دارد. بنابراین با ViewDate پاس دادم به صفحه
var state = await _packageService.GetStateForUserInfo();
ViewData["State"] = state;
var firstLocationId = state.First().LocationId;
var city = await _packageService.GetCityForUserInfo(firstLocationId);
ViewData["City"] = city;
اکر از SelectList استفاده کنم که کلا نال بر میگردونه
ViewData["State"] = new SelectList(state, "Title", "Title ");
برای همین همان ویو مدل رو پاس دادم که LocationId رو به ویو مدل اون اضافه کردم .همان ویو و مدل اصلی صفحه که بتونم بگیرمش ای شهر و استان را
در وییو هم: بالای صفحه
@{
ViewData["Title"] = _localizer["GetUserInfo"];
IEnumerable<UserLocationViewModel> state = ViewData["State"] as
Enumerable<UserLocationViewModel>;
IEnumerable<UserLocationViewModel> city = ViewData["City"] as
IEnumerable<UserLocationViewModel>;
}
و قسمت خود دراپ لیست:
<label class="w-100 d-flex align-items-center" for="">
<label>استان*</label>
<select asp-for="LocationId" asp-items="(@ViewData["State"] as IEnumerable<SelectListItem>)" class="form-control">
<span asp-validation-for="LocationId"></span>
@foreach (var item in ViewBag.state)
{
<option value="@item.LocationId">@item.Title</option>
}
</select>
<label>شهر* </label>
<select asp-for="LocationId" asp-items="(@ViewData["city"] as IEnumerable<SelectListItem>)" id=" " class="form-control ">
<span asp-validation-for="LocationId"></span>
@foreach (var item in ViewBag.city)
{
<option value="@item.LocationId">@item.Title</option>
}
</select>
</label>
اینم عکس جدول برای درک بیشتر
مشکل: الان توی Get استان و شهر را بر میگردونه ولی توی متد پست فقط اولین آی دی توی دیتابیس ؛ یعتی آی دی 2 را بر میگردونه
اگر کلا شهر رو حذف کنم هم متد هم توی ویو
آی دی استان رو درست بر میگردونه و آی دی های دیگه رو بر میگردنه و در دیتابیس سیو میکنه
اما با شهر ( که باید id==parentId ) باشه ای دی شهر رو نمی گیره
اینم متد post که خودش همون طور که گفتم یه ویو مدل دیگه هم داره و یک فرم که اطالاعاتی دارد را ذخیره میکند
public async Task<IActionResult> FirstStartUserInfo(CreateFirstStartUserInfoViewModel firstStartUserInfo )
{
var userId = User.GetCurrentUserId();
var res = await _packageService.CreateFirstStartUserInfoByUser(firstStartUserInfo, userId);
return View(firstStartUserInfo);
}
به ویو مدل اصلی صفحه این پراپرتی اضافه شده
public long? LocationId { get; set; }
سلکت لیست هم قبلا با آی دی توشنه بودم و یه جی کویری هم نوشته بودم .آی دی شهر رو نمی رگفت فکر میکردم اشمال از کدهامه ولی کگویا اشنال از جی کویری هست میشه لطفا کدهای جی کویری رو ببینید. البته از selectList استفاده نکردم از ویو مدل استفاده کردم فکر کنم اشکال از مقدار دهی option هست .حالا که از ویو مدلی اسافاده گردم که titile , locationID داره باید چی بذارم ایتحا؟
<label class="w-100 d-flex align-items-center" for="">
<label>استان* </label>
<select asp-for="LocationId" asp-items="(@ViewData["State"] as IEnumerable<SelectListItem>)" id="Location_Id" class="form-control">
@*<option value="0">لطفا انتخاب کنید</option>*@
@if (state.Any())
{
@foreach (var item in state)
{
<option value="@item.LocationId">@item.Title</option>
}
}
</select>
<span asp-validation-for="LocationId"></span>
<label>شهر* </label>
<select asp-for="LocationId" asp-items="(@ViewData["city"] as IEnumerable<SelectListItem>)" id="SubLocation_Id" class="form-control ">
@foreach (var item in city)
{
<option value="@item.LocationId ">@item.Title</option>
}
</select>
<span asp-validation-for="LocationId"></span>
</label>
و کد جی کویری:
@section scripts
{
<script>
$("#Location_Id").change(function() {
$("#SubLocation_Id").empty();
$.getJSON("/UserPanel/UserInfo/GetSubGroup/" + $("Location_Id:selected").val(),
function(data) {
$.each(data,
function() {
/* $("#SubLocation_Id").append('<option value=' + this.title + '</option>');*/
$("#SubLocation_Id").append('<option value=' + this.value + '>' + this.text + '</option>');
});
});
});
</script>
}
اگر هدف شما این هست که با انتخاب DropDownList مربوط به استان، لیست شهرهای اون استان در DropDownList بعدی نمایش داده بشه، شما خیلی راحت میتونید این کار رو از طریق دستورات جی کوئری و Ajax انجام بدید. ببینید روشی که شما انتخاب کردید کلا Server Side هست و با انتخاب استان از تگ Select اول یکبار صفحه رفرش میشه تا لیست شهرها نمایش داده بشه و در این صورت مقدار استان از بین میره.
شما باید حتما از Jquery Ajax استفاده کنید برای این منظور.
ابتدا دو تگ Select در View خودتون قرار بدید. یکی برای نمایش لیست استان ها و یکی هم برای نمایش لیست شهرها. سپس از سمت کنترلر لیست استان ها رو در تگ select مروبط به استان ها نمایش بدید. به کدهای زیر دقت کنید :
کدهای سمت Controller
public IActionResult Index()
{
List<Province> ListProvice = _db.provinceTbl.ToList();
ViewBag.ListPrv = ListProvice;
return View();
}
در کدهای بالا Provience همان جدول استان ها می باشد. شما میتونید اگر یک جدول دارید مطابق با جدول خودتون لیست استان ها رو استخراج کنید.
کدهای سمت View
@{
List<Province> ProvinceList = ViewBag.ListPrv;
}
<!--استان-->
<div class="form-group">
<select id="sltProvince" asp-items="@(new SelectList(ProvinceList,"ID","ProvinceName"))"></select>
<label>انتخاب استان</label>
</div>
<!--شهر-->
<div class="form-group" id="divcity">
<select id="cityid"></select>
<label>انتخاب شهر</label>
</div>
خب در کدهای بالا وقتی شما پروژه رو Run می کنید لیست استان ها نمایش داده میشه. اما حالا باید با انتخاب هر استان لیست شهرهای مربوطه هم نمایش داده بشه. برای این کار میتونید از جی کوئری کمک بگیرید. بنابراین در ادامه داریم :
<script>
$("#sltProvince").on('change', function (e) {
var getid = $('#sltProvince').val();
$.ajax({
type: 'post',
url: '@Url.Action("getCity","Home")',
data: { id: getid },
success: function (result) {
if (result.status == "success") {
$('#cityid').empty();
$.each(result.cityList, function (i) {
$('#cityid').append($("<option></option>")
.val(result.cityList[i].id).html(result.cityList[i].cname));
});
}
}
});
});
</script>
در دستورات جی کوئری بالا به محض اینکه یک استان جدید از لیست انتخاب می شود رویداد change اجرا می شود و ID استان جدید را دریافت می کند و به سمت کنترلر Home و متد getCity ارسال می کنید. در این متد هم لیست شهرهایی با ID برابر با آیدی استان برگردانده می شود و در تگ select مربوط به شهر نمایش داده می شود.
[HttpPost]
public IActionResult getCity(int id)
{
var cityList = _db.cityTbl.Where(c => c.ProvinceID == id)
.Select(c => new { id = c.ID, cname = c.CityName }).ToList();
return Json(new { status = "success", cityList });
}
مثال بالا رو سعی کردم ساده و کامل براتون توضیح بدیم. اگر هنوز هم مشکلی دارید این فیلم آموزشی که کامل توضیح داده رو دانلود کنید.
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
56
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
96
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
426
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1347
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4796
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
205
- پاسخ :
1
|
تاریخ :
1403/07/26
- ساعت :
09:00:00 PM
- بازدید :
116
- پاسخ :
0
|
تاریخ :
1403/05/16
- ساعت :
09:57:00 AM
- بازدید :
395
- پاسخ :
2
|
تاریخ :
1403/06/25
- ساعت :
11:39:00 PM
- بازدید :
562
- پاسخ :
1
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
56
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
96
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
426
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
930
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1347
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4796
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1157
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
595
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
205
- پاسخ :
1
|