2016-08-25 12 views
0

私は、マザーボード、ケース、ドライブのようなマルチカテゴリーがあると言います。それぞれには、MotherboardsView、CasesView、DrivesViewなどのviewmodelで独自のビューがあります。そして、ViewModels - MotherboardsViewModel、CasesViewModel、およびDrivesModel。 カテゴリに基づいてビューモデルを切り替えるコントローラがあります。 抽象コードは次のようになります。コントローラー内のビューモデルを切り替える

 
//GET Action 
public ActionResult Create(string Category) 
{ 
    switch (Category) 
    { 
     case "Motherboards": 
      var viewModel = new MotherboardsViewModel { }; 
      break; 
     case "Cases": 
      var viewModel = new CasesViewModel { }; 
      break; 
     default: 
      var viewModel = new DrivesViewModel { }; 
      break; 
    } 

    //Here i use switched viewmodel to change some values, like: 
    viewModel.Name = GetRandomName(); 
    ... 

    //And i return view and viewmodel 
    return View(Category + "View", viewmodel) 
} 

ことが可能であり、私はこの問題を解決することができますか?

+0

試したときに何が起こったのですか? – Crowcoder

+0

私はviewmodelの値を変更する必要がある部分は、 "名前 'viewmodel'は現在のコンテキストに存在しません"を示します。 – Aaron

+0

右。あなたは簡単な変数スコープの問題があります。 return文のスコープ内で 'viewmodel'を宣言してください。 – Crowcoder

答えて

0

これは基本的なプログラミングの概念であり、特にMVCには関係しません。変数は、変数を使用するコードの「スコープ」内で宣言する必要があります。 viewmodelはswitchステートメント内で宣言されており、そのコードブロックの外側には表示されません。メソッドの任意のコードからアクセスできるようにviewmodelを宣言してください。通知varが削除されました。

//GET Action 
public ActionResult Create(string Category) 
{ 
    object viewmodel = null; 

    switch (Category) 
    { 
     case "Motherboards": 

      MotherboardviewModel = new MotherboardsViewModel { }; 
      //Here i use switched viewmodel to change some values, like: 
      MotherboardviewModel.Name = GetRandomName(); 
      ... 
      viewModel = MotherboardviewModel; 

      break; 
     case "Cases": 

      CaseviewModel = new CasesViewModel { }; 
      //Here i use switched viewmodel to change some values, like: 
      CaseviewModel.Name = GetRandomName(); 
      ... 
      viewModel = CasesviewModel; 

      break; 
     default: 

      DriveviewModel = new DrivesViewModel { }; 
      //Here i use switched viewmodel to change some values, like: 
      DriveviewModel.Name = GetRandomName(); 
      ... 
      viewModel = DriveviewModel; 

      break; 
    } 

    //And i return view and viewmodel 
    return View(Category + "View", viewmodel) 
} 
+0

それは本当に私はちょうどviewmodelを宣言する方法を知っていた本当です。しかし、このように宣言することで別の問題が発生します: "オブジェクトには '名前'の定義が含まれておらず、拡張メソッドもありません '名前'タイプの 'オブジェクト'の最初の引数を受け入れることができます(usingディレクティブまたはアセンブリ参照?)"。これは、ビューモデルをnullオブジェクトとして宣言したためです。 – Aaron

+0

いいえ、それはnull参照例外を与えます。 'object'にはnameプロパティがないため、 'Name'にアクセスするには特定のTypeにキャストする必要があります。あなたのvmsがnameプロパティを持つ共通インタフェースを実装していれば、オブジェクトを使用する必要はありません。 – Crowcoder

+0

私は今、モバイルです、私の例を修正することはできません。最も簡単なことは、各switch文でコードを繰り返すことです。良いデザインではなく、すばやく汚れています。 – Crowcoder

関連する問題