C# 我应该在控制器中使用常规方法吗?

C# 我应该在控制器中使用常规方法吗?,c#,asp.net-mvc,C#,Asp.net Mvc,所以基本上我有一个视图模型,看起来像这样: public class KorisnikDugovanjaViewModel { public IEnumerable<Dug> Dugovanja { get; set; } public IEnumerable<Korisnik> Korisnici { get; set; } public Korisnik Korisnik { get; set; }

所以基本上我有一个视图模型,看起来像这样:

public class KorisnikDugovanjaViewModel
    {
        public IEnumerable<Dug> Dugovanja { get; set; }
        public IEnumerable<Korisnik> Korisnici { get; set; }
        public Korisnik Korisnik { get; set; }

        public decimal UkupnoDuznik { get; set; }
        public decimal UkupnoVjerovnik { get; set; }

        public IEnumerable<SumaPoDuzniku> SumePoDuzniku { get; set; }
        public IEnumerable<SumaPoVjerovniku> SumePoVjerovniku { get; set; }
    }

    public class SumaPoDuzniku
    {
        public string Ime { get; set; }
        public decimal Iznos { get; set; }
    }

    public class SumaPoVjerovniku
    {
        public string Ime { get; set; }
        public decimal Iznos { get; set; }
    }
或者它通常是以完全不同的方式完成的?我只是想学习如何有效地构造代码。 我还注意到,当我发布表单时,页面会刷新,
VratiModel()
方法应该返回一个用新模型填充的视图,但事实并非如此,在我再次刷新页面之前,模型保持不变,这正常吗?我应该以某种方式使用模型状态吗?我不懂


附加问题:我如何处理会话?我是否应该在每个方法的开头检查用户是否已登录?可以在构造函数中完成吗?控制器的构造函数实际上是如何工作的?您可能已经注意到,我在
VratiModel()
方法的开头使用了我的
userId
,在所有其他方法上,这似乎有点糟糕。

首先,在控制器中使用非动作方法是完全可以的。但是,您应该注意,从技术上讲,任何公共方法都可以是操作。因此,您的非操作方法应该是受保护的或私有的,这取决于您是否需要它们对派生类可用

至于你的视图模型没有在帖子上更新,很难说没有看到你的动作。但是,一般来说,您会有以下情况:

public ActionResult Foo()

[HttpPost]
public ActionResult Foo(FooViewModel model)
换句话说,post操作将接受视图模型作为参数返回。如果代码中的场景是这样的,那么返回视图模型的方法可以选择接受发布的版本

protected KorisnikDugovanjaViewModel VratiModel(KorisnikDugovanjaViewModel model = null)
然后,如果模型为null,则创建一个新模型。否则,您只需更改发布的版本

protected KorisnikDugovanjaViewModel VratiModel(KorisnikDugovanjaViewModel model = null)
最后,看起来您正在使用某种自定义方法进行身份验证/授权。不管怎么说,这通常是个坏主意,但它有点让你不可能真正帮助你解决奖金问题,因为我们不知道这一切是如何运作的。然而,如果您使用开箱即用的解决方案,比如Identity,事情就相当简单了

为了确保操作受到保护,用户需要登录才能访问它,您只需使用
[Authorize]
装饰您的操作/控制器即可。如果在控制器级别执行此操作,则默认情况下所有操作都将获得授权

[Authorize]
public class MyController : Controller
这样,您就不需要检查您的操作中的任何内容。用户将自动获得该操作或重定向到登录页面进行授权


如果您确实需要一些关于用户的信息,您可以通过
user
获取这些信息。它是控制器上的内置属性。特别是,您可以执行诸如
User.Identity.Name
之类的操作来获取用户名,或者
User.Identity.GetUserId()
来获取用户的id。如果您需要数据库中用户表中的更多特定信息,则可以使用用户id进行查询。

好的,我完全忘记了我应该将其声明为“private”。这可能就是我的心病。在模型方面,模型绑定工作得很好,但是场景是这样的:我的视图页面显示了数据库中的一个表,视图中有一个表单可以更新一些行,当我发布表单时,数据库成功更新,但是我的视图页面没有反映更改,除非我单击“刷新”。此外,我也很喜欢《银河守护者》中的你:d确保你正在使用后期模型返回视图,即
返回视图(模型)。我从问题中的方法返回带有模型的视图,如下所示:
返回视图(VratiModel())在post方法更新数据库之后。它应该生成一个新的视图,但它不会,除非我通过刷新和不使用post来强制它。正常操作和后期操作的末尾都有一行,即:
returnview(VratiModel())
但是post one以某种方式返回了模型,其中包含了我发布之前的状态。请重新阅读我的答案。这就是我所说的需要接受现有视图模型实例的
VratiModel
方法。实际上,您在GET和POST上都返回了一个新的视图模型,因此没有显示用户的更改。我很确定我理解您的意思,但我的方法有什么问题,
VratiModel
方法只是从数据库读取数据,并基于此返回视图,既然用户对数据库的更改是在我调用
返回视图(VratiModel())
之前在POST中完成的,为什么不反映出来呢?或者我只是不明白实体框架和存储库是如何工作的,所以错误就在那里?