PDA

View Full Version : مشکل این کد چیه



navidsal
یک شنبه 08 شهریور 1394, 10:59 صبح
من دو تا جدول دارم یکی جدول اخبار و یکی جدول گروه اخبار
میخوام در ویو همه گروههای خبری رو لیست کنم و کنارش بنویسم که چند تا خبر مربوط به هر گروه داریم

مدل هام بصورت خلاصه اینجوری هستن

گروه اخبار


public long GroupId { get; set; }
public string Name { get; set; }


خبر


public long newsId { get; set; }
public string Title { get; set; }

public long GroupId { get; set; }


و در کنترلر این کد رو نوشتم



public ActionResult Index()
{
var db = new ApplicationDbContext();
var CountNews = from p in db.tbl_GroupNews
let cCount = (from c in db.tbl_News
where p.GroupId== c.GroupId
select c
).Count()
select new { GroupId= p.GroupId, coun = cCount };


ViewBag.CountNews= CountNews.Count();
}


و یه پارشیال ویو دارم که همه گروهها رو لیست میکنه و میخوام کنار اسم هر گروه تعداد خبر های اون گروه رو هم نشون بده

پارشیال


@foreach (var item in Model)
{




<div class="info-box">

<div class="info-box-content">
<span class="info-box-text">@item.Name::تعداد خبرهای این گروه خبری</span>
<span class="info-box-number">
@ViewBag.CountNews
</span>


</div><!-- /.info-box-content -->
</div><!-- /.info-box -->

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

Dr.Bronx
دوشنبه 09 شهریور 1394, 22:50 عصر
خوب الان مشکلش کجاست بالاخره ؟
خطا میده ؟ اجرا نمیشه اصلا ؟ کامپایل نمیشه ؟

ali_72
چهارشنبه 11 شهریور 1394, 07:18 صبح
من دو تا جدول دارم یکی جدول اخبار و یکی جدول گروه اخبار
میخوام در ویو همه گروههای خبری رو لیست کنم و کنارش بنویسم که چند تا خبر مربوط به هر گروه داریم

مدل هام بصورت خلاصه اینجوری هستن

گروه اخبار


public long GroupId { get; set; }
public string Name { get; set; }


خبر


public long newsId { get; set; }
public string Title { get; set; }

public long GroupId { get; set; }


و در کنترلر این کد رو نوشتم



public ActionResult Index()
{
var db = new ApplicationDbContext();
var CountNews = from p in db.tbl_GroupNews
let cCount = (from c in db.tbl_News
where p.GroupId== c.GroupId
select c
).Count()
select new { GroupId= p.GroupId, coun = cCount };


ViewBag.CountNews= CountNews.Count();
}


و یه پارشیال ویو دارم که همه گروهها رو لیست میکنه و میخوام کنار اسم هر گروه تعداد خبر های اون گروه رو هم نشون بده

پارشیال


@foreach (var item in Model)
{




<div class="info-box">

<div class="info-box-content">
<span class="info-box-text">@item.Name::تعداد خبرهای این گروه خبری</span>
<span class="info-box-number">
@ViewBag.CountNews
</span>


</div><!-- /.info-box-content -->
</div><!-- /.info-box -->

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

کدت اشتباهه
الان viewbag برای کد شما مقدار رکورد آخر رو میگیره تعریف viewbag برای اینکار معنی نداره
یه viewmodel تعریف کن و کدت رو دوباره بنویس

navidsal
شنبه 14 شهریور 1394, 14:50 عصر
کدت اشتباهه
الان viewbag برای کد شما مقدار رکورد آخر رو میگیره تعریف viewbag برای اینکار معنی نداره
یه viewmodel تعریف کن و کدت رو دوباره بنویس

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

(ببخشید اول نگفتم که این کد هیچ مقداری رو نشون نمیده )

sunn789
شنبه 14 شهریور 1394, 18:00 عصر
همانطور که دوستمون گفت میتوانید با وی مودل این کار رو انجام بدین. ویوو مودل هم کلاسی است تقریبا البته تقریبا شبیه کلاس مودل که قرار است اطلاعتی را که ویوورندان داره رو آماده کنه ز همچنین میتونی اطلاعت اضافی مانندانچه الان نیاز داری رو محاسبه کنه و به ویوو بفرسته، اما مطلب دیگر اینکه اساس ارتباط دو جدول مشکل داره، یه کم از استاندارد به دوره

ali_72
دوشنبه 16 شهریور 1394, 08:28 صبح
ممنون دوست عزیز
منظورتون رو از اینکه میگین یه ویو مدل تعریف کنم و دوباره کد رو بنویسم نمیفهمم
میشه بیشتر توضیح بدین

(ببخشید اول نگفتم که این کد هیچ مقداری رو نشون نمیده )

نمیدونم ساختار برنامت چطوریه
ولی با فرض اینکه مدل هات در پوشه model برنامت هستند یه کلاس ایجاد کن مثلا با نام GroupNewsViewModel
به تعداد فیلدهایی که باید در ویو نمایش داده شه
مثلا عنوان گروه خبری - تعداد گروه خبری پراپرتی بساز
مثلا این ویو مدل رو نگاه کن


public class GroupNewsViewModel {

public string titr{ get; set; }



public int tedad{ get; set; }
}

حالا در اکشن این ویو مدل را پر کن و به view پاس بده و در ویو از فیلدهاش استفاده کن


List<GroupNewsViewModel> model= db.GroupNews.Select(s => new GroupNewsViewModel {

tedad = s.akhbar.Count(p => p.Id_goroh == s.Id),
titr= s.titr
});


return view(model);

موفق باشید

مهدی کرامتی
دوشنبه 16 شهریور 1394, 09:14 صبح
یک راه خیلی بهتر اضافه کردن Navigation Property به هر دو کلاس است.


public class Group
{
public long GroupId { get; set; }
public string Name { get; set; }
// Navigation Properties
public list<News> News {get;set;}
}

public class News
{
public long newsId { get; set; }
public string Title { get; set; }

public long GroupId { get; set; }

// Navigation Properties
public Group Group {get;set;}
}

این طوری در View کافیه به ازای هر گروه چنین چیزی داشته باشی:


@Group.Name (@Group.News.Count())

Dr.Bronx
سه شنبه 17 شهریور 1394, 11:14 صبح
یک راه خیلی بهتر اضافه کردن Navigation Property به هر دو کلاس است.


public class Group
{
public long GroupId { get; set; }
public string Name { get; set; }
// Navigation Properties
public list<News> News {get;set;}
}

public class News
{
public long newsId { get; set; }
public string Title { get; set; }

public long GroupId { get; set; }

// Navigation Properties
public Group Group {get;set;}
}

این طوری در View کافیه به ازای هر گروه چنین چیزی داشته باشی:


@Group.Name (@Group.News.Count())


به نظر من راه مناسبی نیست این کار.
در این صورت که اگر نیازی به اون فیلد در جایی نداشته باشیم که باز هم اون اطلاعات داره از سرور خونده میشه .
چون شما virtual هم نگرفتید فیلد هارو و lazy نیستند و در هر مرحله همه اطلاعات به هر حال خونده میشه .
بعد هم ما فقط count رو میخوایم دلیل نداره کل جدول هارو به هم انتساب بدیم .
به نظر من همون ViewModel برای این کار خیلی مناسب تر هست . چون می تونیم یک پراپرتی داشته باشیم مثلا به نام NewsCount و فقط count اون جدول رو داخلش نگه داریم .

موفق باشید ./