2017-05-03 24 views
1

だから、基本的に私はこのようになりますビューモデルを持っている:私は、インデックスページに投稿するとき、私はインデックスページで、2つのシナリオでは、私のビューにそのモデルを渡す必要があり、コントローラに通常の方法を使用する必要がありますか?

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; } 
    } 

、そうすべきです私は、そのモデルを私のインデックス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()メソッドで新しいモデルが読み込まれたビューが返されるはずですが、そうではありません。どういうわけか、モデルの状態を使うべきですか?私は無知だ。

ボーナスに関する質問:どのようにセッションを処理しますか?すべての方法の始めにユーザーがログインしているかどうかを確認する必要がありますか?それはコンストラクタで行うことができますか?コントローラのコンストラクタは実際にどのように機能しますか?あなたは私がuserIdVratiModel()メソッドの始めに使用していることに気づいたかもしれません。そして、他のすべてのメソッドでは、ちょっと悪いようです。

答えて

4

まず、コントローラーにアクション以外の方法を使用することは大丈夫です。ただし、技術的には公開のメソッドがアクションになることに注意してください。結果として、非アクションのメソッドは、派生クラスで使用できるかどうかに応じて、保護されているか、または非公開である必要があります。

あなたのビューモデルは投稿時に更新されていないため、あなたの行動を見ることができないと言うのは難しいです。しかし、一般的に言えば、次のようなものがあります:

public ActionResult Foo() 

[HttpPost] 
public ActionResult Foo(FooViewModel model) 

つまり、ポストアクションは、パラメタとしてビューモデルを戻します。これがコードのシナリオであれば、ビューモデルを返すメソッドは、オプションで投稿されたバージョンを受け入れる必要があります。

protected KorisnikDugovanjaViewModel VratiModel(KorisnikDugovanjaViewModel model = null) 

次に、モデルがnullの場合は、新しいモデルを作成します。それ以外の場合は、投稿されたバージョンを変更するだけです。

最後に、認証/承認にカスタムメソッドを使用しているかのように見えます。とにかくそれは一般的に悪い考えですが、ボーナスに関する質問を本当にお手伝いすることは不可能です。私たちはそれがどのように機能するかについての可視性がないからです。しかし、アイデンティティのような、すぐに使えるソリューションを使用すれば、物事はかなり簡単です。

ユーザーがアクセスするためにユーザーがログインする必要があるように、アクションが保護されていることを確認するには、アクション/コントローラーを[Authorize]で飾るだけです。コントローラー・レベルで実行すると、すべてのアクションがデフォルトで許可されます。

[Authorize] 
public class MyController : Controller 

あなたの行動で何かを確認する必要はありません。ユーザーは自動的にアクションを提供されるか、ログインページにリダイレクトされて自分自身を認証します。

ユーザーに関する情報が必要な場合は、Userで取得できます。これはコントローラの内蔵プロパティです。特に、User.Identity.Nameのようなものを使用してユーザー名を取得するか、User.Identity.GetUserId()を使用してユーザーのIDを取得することができます。データベース内のユーザーテーブルからより詳細な情報が必要な場合は、ユーザーのIDを使用して照会することができます。

+0

私は何とか私はそれを「私的」と宣言しなければならないことを完全に忘れていました。それはおそらく私を悩ませたものです。モデルの事では、モデルのバインディングは完全に機能しますが、シナリオは次のようなものです:私のビューページは私のデータベースのテーブルを表示します。ビューはフォームをいくつか更新できます。正常に更新されましたが、[更新]をクリックしない限り、ビューページに変更が反映されませんでした。また、ギャラクシーのガーディアンであなたを愛しました:D –

+0

ポストモデル*、すなわち 'return view(model); 'でビュー*を返すようにしてください。 –

+0

私はモデルのビューを次のように質問のメソッドから戻します。postメソッドがデータベースを更新した後の 'return View(VratiModel());'新しいビューを生成するはずですが、投稿を使用しないでリフレッシュして強制しない限り、表示されません。 'Return View(VratiModel());'のように、通常のアクションとポストアクションの両方に同じ行がありますが、ポストのものは、投稿前の状態のモデルを返します。 –

関連する問題