在我的 SessionView 模型中,我尝试将数据库中的数据分配到本地变量中,然后将此数据分配给相关的公共属性(而不是在控制器中执行)。
我试图通过使用以下代码来实现这一点,但是当数据被询问时它会崩溃,大概是因为我在其中定义了相同的模型。
public class SessionView : BaseViewModel
{
public int SessionId { get; set; }
private SessionView data
{
get
{
return (from s in db.Sessions
where s.SessionId == SessionId
select new SessionView
{
CourseId = s.CourseId
// ... lots of other properties
}).FirstOrDefault();
}
set { }
}
public int CourseId { get { return data.CourseId; } set { } }
// ... lots of other properties
}
有没有一些聪明的方法可以实现这一点而不会出错?
谢谢。
答案 0 :(得分:1)
我认为最好的方法是将数据检索放在构造函数中: 通过这种方式,每当有人在此类中引用时,您只需检索一次数据,从而减少检索开销并优化代码。
简单来说,每次我使用变量web
时,我都会从数据库中查询它。
app
答案 1 :(得分:1)
我认为你的问题是你的模型上的数据加载实际上是在视图中发生的,这在MVC中是一种不好的做法,而你应该在控制器上通过使用服务来实现,如:
public class SessionController : Controller
{
private readonly ISessionsService sessionService;
public SessionController(ISessionsService sessionsService)
{
this.sessionService = sessionService;
}
public ActionResult SessionData(int sessionId)
{
var sessionData = sessionService.GetById(sessionId);
/// do whatever validation you might require here
var model = new SessionView(sessionData); // you could even pass the sessionId if required here
return View(model);
}
}
您可以将 Dependency-Injected 服务提供给您的控制器。我认为这是在MVC上执行此操作的首选方法
答案 2 :(得分:1)
你在哪里读到控制器应该瘦而不胖?控制器中的业务逻辑不是很好,因为它比在业务逻辑层中更难重用,但不要仅仅与数据库访问混淆;如果你能提供帮助,那绝对应该远离模特。
这种工作,为您的模型分配数据库值 - 这正是MVC中的控制器所针对的。我会选择这样的东西。
<强>模型强>
public class SessionView : BaseViewModel
{
public int SessionId { get; set; }
public int CourseId { get; set; }
// ... lots of other properties
}
<强>控制器强>
public class HomeController : Controller
{
public ActionResult Index(){
var context = new MyContext();
var firstSession = context.Sessions.First();
var viewModel = new SessionView
{
SessionId = firstSession.SessionId,
CourseId = firstSession.CourseId,
//keep populating here if you need
};
return View(viewModel);
}
}