我应该在控制器中使用正常的方法吗?
所以基本上我有一个看起来像这样的视图模型:我应该在控制器中使用正常的方法吗?
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; }
}
我需要这种模式传递给我的看法在2种情况,索引页上,当我张贴的索引页,所以应该我在我的索引metod和我的http post index方法中填充模型,或者我应该制作一个看起来像这样的方法,并在我需要传递模型时调用它?
public KorisnikDugovanjaViewModel VratiModel()
{
int userId = int.Parse(Session["User"].ToString());
KorisnikDugovanjaViewModel model = new KorisnikDugovanjaViewModel
{
Dugovanja = dugRepository.Dugovanja
.Where(m => (m.Duznik.Id == userId || m.Vjerovnik.Id == userId)),
Korisnici = korisnikRepository.Korisnici,
Korisnik = korisnikRepository.Korisnici.FirstOrDefault(m => m.Id == userId),
UkupnoDuznik = dugRepository.Dugovanja
.Where(m => m.DuznikId == userId && !m.Zatvoreno).Sum(m => m.Iznos),
UkupnoVjerovnik = dugRepository.Dugovanja
.Where(m => m.VjerovnikId == userId && !m.Zatvoreno).Sum(m => m.Iznos),
SumePoDuzniku = dugRepository.Dugovanja
.Where(a => a.DuznikId == userId && !a.Zatvoreno)
.GroupBy(a => a.Vjerovnik.Ime)
.Select(a => new SumaPoDuzniku
{
Ime = a.Key,
Iznos = a.Sum(b => b.Iznos)
}),
SumePoVjerovniku = dugRepository.Dugovanja
.Where(a => a.VjerovnikId == userId && !a.Zatvoreno)
.GroupBy(a => a.Duznik.Ime)
.Select(a => new SumaPoVjerovniku
{
Ime = a.Key,
Iznos = a.Sum(b => b.Iznos)
})
};
return model;
}
或者它通常以完全不同的方式完成?我只想学习如何有效地构建我的代码。 另外我注意到,当我与表单POST,页面刷新,VratiModel()
方法应该返回一个视图填充新模型,但它不是,模型保持不变,直到我再次刷新页面,这是正常的吗?我应该使用模型状态吗?我无能为力。
奖金问题:我如何处理会话?我应该检查用户是否在每种方法的开始时都登录?它可以在构造函数中完成吗?控制器的构造函数是如何工作的?您可能已经注意到,我在VratiModel()
方法的开头使用了我的userId
,而在所有其他方法中,它看起来有点不好。
首先,在控制器中使用非动作方法是完全可以的。但是,您应该注意,技术上任何公众方法都可以是一种行为。因此,您的非操作方法应该是受保护的或私有的,这取决于您是否需要它们可用于派生类。
至于你的视图模型没有在后期更新,很难说如果不能看到你的动作。但是,一般来说,你会有这样的东西:
public ActionResult Foo()
[HttpPost]
public ActionResult Foo(FooViewModel model)
换句话说,后动作会接受视图模型作为参数。如果这是你的代码的情况,那么你的方法返回你的视图模型,应该可选地接受发布的版本。
protected KorisnikDugovanjaViewModel VratiModel(KorisnikDugovanjaViewModel model = null)
然后,如果模型为null,则创建一个新模型。否则,您只需更改发布的版本。
最后,它看起来好像您正在使用某种自定义方法进行身份验证/授权。无论如何,这通常是一个糟糕的主意,但这种做法会让你无法真正帮助你解决你的奖金问题,因为我们不知道所有的工作方式。但是,如果您使用开箱即用的解决方案(例如Identity),那么事情很简单。
为确保操作受到保护,以便用户需要登录才能访问它,您只需使用[Authorize]
装饰您的操作/控制器即可。如果您在控制器级别执行此操作,则默认授权所有操作。
[Authorize]
public class MyController : Controller
然后,您不需要检查任何操作。用户将自动或者被送达该行动或被重定向到登录页面以授权他们自己。
如果您确实需要某种关于用户的信息,您可以通过User
取回。它是控制器上的内置属性。特别是,您可以执行诸如User.Identity.Name
之类的操作来获取用户名或User.Identity.GetUserId()
以获取用户的ID。如果您需要数据库中用户表的更多特定信息,则可以使用用户的ID来查询它。
好吧,我完全忘了我应该声明它是'私人'。这可能是窃听我的。在模型的事情上,模型绑定的东西完美的作品,但情况是这样的:我的视图页面显示从我的数据库表,我有一个窗体在视图中,可以更新一些行,当我张贴表单数据库已成功更新,但我的浏览页面没有反映出这种变化,除非我点击'刷新'。此外,在银河护卫队中爱你:D –
确保你使用后期模型返回视图*,即'返回视图(模型);'。 –
我从问题中的方法返回视图,如下所示:'返回视图(VratiModel());'在post方法更新数据库后。它应该生成一个新的视图,但它不会,除非我通过刷新和不使用post来强制它。普通操作和后操作在最后都有相同的行,即:'返回View(VratiModel());'但后一种方式返回模型与我发布之前的状态。 –