PDA

View Full Version : سوال: مشکل با ViewModel



gama_slv
یک شنبه 12 آبان 1392, 13:07 عصر
سه تا تیبل دارم به نام members عضو , پرداخت هاPayments, وامLoan
میخوام برای مدیریت عضو یک view بسازم که یکسری فیلد از سه تا تیبل بالا رو توش داره و مثل Details فقط یک رکورد رو id یکی از تیبل ها نشون بدم
باید برای فقط یک کاربر( members) آخرین پرداخت و وام جاری به اضافه موجودیش رو توی یک صفحه نشون بدم.
برای همین یک ViewModel ساختم که فیلد هایی که میخوام نمایش بدم رو از سه تا کلاسه دیگه جدا کردم و تو ویو مدلم گذاشتم.

ویو مدلم این شکلیه
// members
[Key]
public int MemberID { get; set; }
public int PeykID { get; set; }
public int RangeID { get; set; }
public int Store { get; set; }
public int Stock { get; set; }
public Nullable<bool> IsSaye { get; set; }

//Payments
public int PaymentID { get; set; }
public int PaymentTypeID { get; set; }
public System.DateTime DatePeyment { get; set; }
public int Amount { get; set; }

//Loans
public int LoanID { get; set; }
public Nullable<System.DateTime> LoanDate { get; set; }
public Nullable<int> TotalLoan { get; set; }
public Nullable<int> Remaining { get; set; }


حالا مشکلم اینه که نمیتونم از روی ویو مدلم Details بسازم ؟؟؟

gama_slv
سه شنبه 28 آبان 1392, 13:06 عصر
کسی نیست جواب بده خیلی گیرم تورو خدا یکی جواب بده

alireza.tabesh
چهارشنبه 29 آبان 1392, 15:05 عصر
باید کوئری اجرا کنی
یک کلاس ایجاد کنی داخلش :

public partial class ViewClass
{
public static IQueryable[ViewModel] GetDetails(int id)
{
var model = from r in db.Table
where TableId==id
select new ViewModel
{
ViewModelColumn1 = r.column1
.
.
.
};
return model;
}
}

اینجوری مدل بدست اومده رو استفاده می کنی .

gama_slv
یک شنبه 03 آذر 1392, 20:18 عصر
کد رو نتونسم انجام بدم چون بعضی از فیلد ها رو نمیتونم بیارم به خاطر ریلیشنی که زدم
یک کوئری زدم که فیلتری که میخوام رو انجام بده
from members in db.Members
join payments in db.Payments on members.MemberID equals payments.MemberID
join laons in db.Laons on members.MemberID equals laons.MemberID
select new {
MemberID = (Int32?)members.MemberID,
members.Name,
members.Family,
members.sex,
members.Education,
members.MemberDate,
members.GroupAge,
members.Store,
members.Stock,
members.IsSaye,
payments.DatePeyment,
payments.Amount,
laons.LoanID,
laons.LoanDate,
laons.TotalLoan,
laons.Remaining,
laons.FinishDate
}
این رو تبدیل به یک لیست میکنم و به ویو پاس میدم ولی نمیتونم id رو به ویو بفرستم تا فیلتر بشه
البته این دیگه از ویو مدل دیگه استفاده نمیکنه نمیدونم باید چی کار کنم پارشیال ویو هم نمیتون استفاده کنم چون باید برای هر پارشیال یک id بفرستم
بهترین روش استفاده از viewmodel ولی همه مثال ها برای ویو مدل یک جدول و اگر هم چند تا جدول باشه شرطی براش گذاشته نشده و برا اساس یک فیلد فیلتر نمیشه
کسی نمیدونه چطری میشه این کا رو انجام داد

alireza.tabesh
دوشنبه 04 آذر 1392, 11:54 صبح
نیازی به Join نیست. البته اگر شما در model های اولیه join هارو تعریف کرده باشید. و مشکل دیگه در کد شما اینکه وقتی new مینویسید باید بگید که کدوم model باید باشه. مدل جدید رو باید new کنید و نام فیلد های مورد نظر رو قرار بدید . برای نمونه این رو نگاه کنید :

namespace DaaviRefahBank.ReportsModel
{
public class DadkhastReportModel
{
public string KhahanFirstName { get; set; }
public string KhahanLastName { get; set; }
public string KhahanFatherName { get; set; }
public string KhahanAge { get; set; }
public string KhahanJob { get; set; }
public string KhahanAddress { get; set; }
public string KhandehFirstName { get; set; }
public string KhandehLastName { get; set; }
public string KhandehFatherName { get; set; }
public string KhandehAge { get; set; }
public string KhandehJob { get; set; }
public string KhandehAddress { get; set; }
public string VakilFirstName { get; set; }
public string VakilLastName { get; set; }
public string VakilFatherName { get; set; }
public string VakilAge { get; set; }
public string VakilJob { get; set; }
public string VakilAddress { get; set; }
public string DadkhastSubject { get; set; }
public string DalaeelVaZamaeem { get; set; }
public string DadkhastText { get; set; }
public string DadkhastNumAndDate { get; set; }
public string CrimePlace { get; set; }
}

public partial class CDadkhastReport
{
public static IQueryable<DadkhastReportModel> GetReport(Guid? id)
{
var db = new DaaviDB();
var model = from dadkhast in db.DAV_Dadkhast
where dadkhast.PKDadkhastID == id
select new DadkhastReportModel
{
KhahanFirstName = dadkhast.GNL_Entity.FirstOrDefault().FirstName,
KhahanLastName = dadkhast.GNL_Entity.FirstOrDefault().LastName,
KhahanFatherName = dadkhast.GNL_Entity.FirstOrDefault().FatherName,
KhahanAge = dadkhast.GNL_Entity.FirstOrDefault().BirthDate,
KhahanJob = dadkhast.GNL_Entity.FirstOrDefault().Job,
KhahanAddress = dadkhast.GNL_Entity.FirstOrDefault().Adress,
KhandehFirstName = dadkhast.GNL_Entity1.FirstOrDefault().FirstName,
KhandehLastName = dadkhast.GNL_Entity1.FirstOrDefault().LastName,
KhandehFatherName = dadkhast.GNL_Entity1.FirstOrDefault().FatherName,
KhandehAge = dadkhast.GNL_Entity1.FirstOrDefault().BirthDate,
KhandehJob = dadkhast.GNL_Entity1.FirstOrDefault().Job,
KhandehAddress = dadkhast.GNL_Entity1.FirstOrDefault().Adress,
VakilFirstName = dadkhast.GNL_Entity2.FirstOrDefault().FirstName,
VakilLastName = dadkhast.GNL_Entity2.FirstOrDefault().LastName,
VakilFatherName = dadkhast.GNL_Entity2.FirstOrDefault().FatherName,
VakilAge = dadkhast.GNL_Entity2.FirstOrDefault().BirthDate,
VakilJob = dadkhast.GNL_Entity2.FirstOrDefault().Job,
VakilAddress = dadkhast.GNL_Entity2.FirstOrDefault().Adress,
DadkhastSubject = dadkhast.Khaste + " - بهای خواسته : " + SqlFunctions.StringConvert(dadkhast.KhastePrice) ,
DalaeelVaZamaeem = dadkhast.Dalayel,
DadkhastText = dadkhast.Sharh,
DadkhastNumAndDate = dadkhast.DadkhastNumber + " - " + dadkhast.DadkhastDate,
CrimePlace =dadkhast.CrimePlace
};
return model;
}
}
}


توجه کنید که من ID رو بعنوان یک پارامتر در اختیار query میذارم و نتیجه رو دریافت می کنم . البته من بخاطر اینکه برای report استفاده کردم IQueryable گذاشتم و شما باید از IEnumrable استفاده کنید و مدل رو .toList() بازگشت بدید .

gama_slv
دوشنبه 04 آذر 1392, 13:01 عصر
تمام join ها قبلا تعریف کردم.
اگر درست متوجه شده باشم برای هر table باید یک مدل new کنم و فیلد ها رو بهش معرفی کنم اگر سه تا جدول هست باد سه بار کوئری بنویسم یا اینکه var model = from dadkhast in db.DAV_Dadkhast بعدش بقیه جدولها رو هم بیارم؟
من ویو مدل رو تغییر دادم

public class BasicViewModel
{
public Members member { get; set; }
public Payments payment { get; set; }
public Laons laon { get; set; }

public BasicViewModel(int MemberID)
{
var db = new ApiaryEntities();
member = db.Members.First(x => x.MemberID == MemberID);
laon = db.Laons.First(x=>x.MemberID==MemberID);
payment = db.Payments.First(x => x.MemberID == MemberID);
}

}
}

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

public ActionResult Index(int id)
{

var viewModel = new BasicViewModel(id);
return View(viewModel);
}

ویو رو هم

<fieldset>
<legend>PostCommentViewModel</legend>
@Html.DisplayFor(x => x.member.MemberID)
<br />
@Html.DisplayFor(x => x.member.MemberDate)
<br />
@Html.DisplayFor(x => x.member.Name)
<br />
@Html.DisplayFor(x => x.member.Family)
<br />
@Html.DisplayFor(x => x.payment.Amount)
<hr />
@Html.DisplayFor(x => x.laon.FinishDate)
</fieldset>

دو تاسوال اول اینکه میتونم دو تاشرط رو باهم اعمال کنم برای هر جدولی یا نه مثلا بجز id فیلدی که برابر بود با false؟
دوم این روشی که انجام دادم درسته یا نه؟

alireza.tabesh
دوشنبه 04 آذر 1392, 16:22 عصر
برای هر View که این View شامل چند مدل باشه . البته نه برای ویرایش بلکه برای نمایش. شما برای جدول خودتون راه ساده دارید . یا نیاز به ترکیب اطلاعات یک جدول برای نمایش در یک سلول . چون شما بحث ایجاد یک View رو مطرح کردید من اینطور توضیح دادم . شما می تونید از db.TableName.Tolist() استفاده کنید . البته راهی که گفتید از لحاظ طراحی نرم افزار صحیح تره .
واضح تر بگم :
سه جدول دارید بنام جدول1 ، جدول2 و جدول3 که میخواید با join کردن این جدول ها اطلاعات نمایش داده بشه . شما یک ویو ساختید بنام جدول4 . پس جدول4 new میشه و اطلاعاتش رو از 3 جدول مذکور میگیره