为什么我的通用列表总是空的
本文关键字:列表 我的 为什么 | 更新日期: 2023-09-27 18:06:47
我有一个这样的类:
public class Lugar
{
[Key]
public int LugarId { get; set; }
public List<Review> Reviews { get; set; }
public int SumReviews { get; set; }
public double AverageReviews { get {
if (Reviews == null)
return 0;
else if (Reviews.Count == 0)
return 0;
else
return (double)SumReviews/(Reviews.Count); } }
}
在我的控制器中,我有这个:
[HttpPost, Authorize]
public ActionResult WriteReview(int id, FormCollection formCollection)
{
Lugar lugar = db.Lugares.Find(id);
Review review=new Review();
review.User = User.Identity.Name;
review.Rating=Convert.ToInt32(formCollection["Rating"]);
review.Texto = formCollection["Review"];
if (lugar != null)
{
if( lugar.Reviews==null)
lugar.Reviews=new List<Review>();
lugar.Reviews.Add(review);
lugar.SumReviews += review.Rating;
db.SaveChanges();
}
else
return RedirectToAction("Index");
return RedirectToAction("Index");
}
}
问题在这一行:
如果(lugar.Reviews = = null)卢格。评论=新列表();
每次我执行我得到(lugar.Reviews==null)为真.....
即使我已经为那个地方添加了一个Review, if语句返回true.....
尝试使用'virtual'关键字声明您的列表,看看您是否有更多的运气。
您可能希望在Lugar
类中引入构造函数并在其中实例化列表。像这样:
public void Lugar()
{
Reviews = new List<Review>();
}
希望这对你有帮助。如果不行,请告诉我。
注:另一件事是不相关的具体问题,但肯定是一个改进是使用视图模型,而不是FormCollection。
它将在很大程度上简化你的生活。例如,如何使用它,请看看这个成功回答的问题:什么是MVC中的ViewModel ?你在这里有2个选项,延迟加载(通过在导航属性上添加virtual来启用)这将在c#中访问该属性时拉下你的第二个实体或者在查询中使用.Include(/*lambda or string property name*/)
语句进行即时加载。
我个人更喜欢急切加载,因为你可以更好地控制何时加载实体