如何定义在模型中使用相同的模型

时间:2016-06-06 13:14:15

标签: c# model-view-controller models

在我的 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
}

有没有一些聪明的方法可以实现这一点而不会出错?

谢谢。

3 个答案:

答案 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);
    }
}