2017-05-03 59 views
1

所以基本上我有一個看起來像這樣的視圖模型:我應該在控制器中使用正常的方法嗎?

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,而在所有其他方法中,它看起來有點不好。

回答

4

首先,在控制器中使用非動作方法是完全可以的。但是,您應該注意,技術上任何公衆方法都可以是一種行爲。因此,您的非操作方法應該是受保護的或私有的,這取決於您是否需要它們可用於派生類。

至於你的視圖模型沒有在後期更新,很難說如果不能看到你的動作。但是,一般來說,你會有這樣的東西:

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來查詢它。

+0

好吧,我完全忘了我應該聲明它是'私人'。這可能是竊聽我的。在模型的事情上,模型綁定的東西完美的作品,但情況是這樣的:我的視圖頁面顯示從我的數據庫表,我有一個窗體在視圖中,可以更新一些行,當我張貼表單數據庫已成功更新,但我的瀏覽頁面沒有反映出這種變化,除非我點擊'刷新'。此外,在銀河護衛隊中愛你:D –

+0

確保你使用後期模型返回視圖*,即'返回視圖(模型);'。 –

+0

我從問題中的方法返回視圖,如下所示:'返回視圖(VratiModel());'在post方法更新數據庫後。它應該生成一個新的視圖,但它不會,除非我通過刷新和不使用post來強制它。普通操作和後操作在最後都有相同的行,即:'返回View(VratiModel());'但後一種方式返回模型與我發佈之前的狀態。 –

相關問題