2012-02-17 9 views
1

私は次のコードを持っています(編集:申し訳ありませんが、もし私が明確でなかったら、私は以下をカプセル化したいと思います。 ActionResultコントローラ内でアクションコードを再利用

私は私のコントローラで異なるアクションでそれを再利用する可能性がどのように
public ActionResult ModelBased(string[] items, PostedItems postedItems) { 
     var model = new ItemsViewModel(); 
     var selectedItems = new List<Item>(); 
     var postedItemIDs = new string[0]; 
     if (postedItems == null) postedItems = new PostedItems(); 

     if (items!= null && items.Any()) { 
      postedCityIDs = items; 
      postedItems.ItemIDs = items; 
     } 

     if (postedItems.ItemIDs != null && postedItems.ItemIDs.Any()) { 
      postedItemIDs = postedIems.ItemIDs; 
      model.WasPosted = true; 
     } 

     if (postedItemIDs.Any()) 
      selectedItems = ItemRepository.GetAll() 
       .Where(x => postedItemIDs.Any(s => x.Id.ToString().Equals(s))).ToList(); 

     model.AvailableItems = ItemRepository.GetAll(); 
     model.SelectedItems = selectedItems; 
     model.PostedItems = postedItems; 

     return View(model); 
    } 

/ペーストをコピーする必要はありません。私はコードでプライベートメソッドを実行しようとしました。しかし、私は上で立ち往生しています:

  1. どちらのアクションメソッド内で、それは間違って呼び出し:private void Item (Item item) {//copied code from above}はその後、アクションでItem(item);呼び出します。または

  2. これは私が間違っている(string[] items, PostedItems postedItems)と関係があります。または

  3. 私が正しくやっていないこととは全く異なるものです。

いずれの例も高く評価されます。

EDIT:上記のコードはCheckBoxListで動作します。 1つの特定のCheckBoxListです。しかし、コードを他のビューにコピー/ペーストすることなく他のビューでも使用できるようにしたいと考えています。ActionResultsActionResultと呼ぶだけではうまくいきません。私は他のことをする予定です。私は何かが欠けていない限り、単にActionResultは、動作しませんするために呼び出す、特定のビューを返している

if ((nextButton != null) && ModelState.IsValid) 
    return RedirectToAction("EMailConfirm"); 
return View("EMail/BasicDetails", myData); 

:特に、私のような各ActionResultのウィザード、ためのコードを持っています。

答えて

1

return View(model);は、元の操作のビューを検索しようとします。

常にあなたの例"ModelBased"


public void SomeAction(string[] items, PostedItems postedItems) 
{ 
    // Modify the data as your like 
    return ModelBased(string[] items, PostedItems postedItems); 
} 

public void SomeOtherAction(string[] items, PostedItems postedItems) 
{ 
    // Modify the data as your like 
    return ModelBased(string[] items, PostedItems postedItems); 
} 

private ActionResult ModelBased(string[] items, PostedItems postedItems) { 
    var model = new ItemsViewModel(); 
    var selectedItems = new List<Item>(); 
    var postedItemIDs = new string[0]; 
    if (postedItems == null) postedItems = new PostedItems(); 

    if (items!= null && items.Any()) { 
     postedCityIDs = items; 
     postedItems.ItemIDs = items; 
    } 

    if (postedItems.ItemIDs != null && postedItems.ItemIDs.Any()) { 
     postedItemIDs = postedIems.ItemIDs; 
     model.WasPosted = true; 
    } 

    if (postedItemIDs.Any()) 
     selectedItems = ItemRepository.GetAll() 
      .Where(x => postedItemIDs.Any(s => x.Id.ToString().Equals(s))).ToList(); 

    model.AvailableItems = ItemRepository.GetAll(); 
    model.SelectedItems = selectedItems; 
    model.PostedItems = postedItems; 

    return View(model); 
} 
+0

これは、「ActionResult」という文字列です。私はコントローラ内の他のアクションでそのコードを再利用する方法を見つけようとしています。基本的に、私は他のアクションに配置する必要があるので、コードを再利用する。私はむしろそれをDRYにしておきます。 – REMESQ

+0

それは私が言っていることです。コードをプライベートメソッドに入れます。しかし、それを動作させるには、ビュー名を指定する必要があります。 – jgauffin

+0

私が誤解して申し訳ありません。私はあなたが何を言っているのかを見ます。私の問題は、ウィザードのコードを追加し、特定のビューをリダイレクトまたは返す場合です。上記の私の編集を参照してください。 – REMESQ

0

という名前のビューをレンダリングするためにreturn View("ModelBased", model);を指定しては不明である、しかし、私は通常、別々の方法に共通の機能を移動し、[NonAction]属性でマークでしょう。例えば。

[NonAction] 
protected UserInfo GetUserInfo(string username) 
{ 
    // Return relevant data 
} 

私はあなたのアクションメソッドでGetUserInfoを呼び出します。

編集:

あなたは部分図を検討する必要があります。部分的なビューは、複数のページで再利用できるコントロールと考えることができます。たとえば、ログインコントロールを部分的なビューに置いて、複数のページにそれを置き換えることができます。これにより、コードの再利用性が向上します。

私はしばらくの間、これを行っていないとして、私はあなたの例を与えることはできませんが、次の操作を行う必要があるだろう。その代わりreturn View();

  1. あなたはreturn PartialView("_NameOfYourPartialView", viewModel);
  2. する必要があります
  3. ビューを変更すると、ビューではなく部分ビューになります。

あなたは少し読書して自分で試してみる必要があります。

幸運

+0

あなたは正しい方向にあります。上記の 'ActionResult'の共通の機能を取りたいと思います。私は 'private void'を試みましたが、そのアクションでそれを呼び出す方法を理解することはできません。 – REMESQ

+0

こんにちは、あなたの行動方法がすべきことを言葉で書いてください。私はModelBasedが何を意味するのか不明です。私は通常、アクションメソッドをユーザーアクションに関連付けます。 –

+0

'ModelBased'は' ModelBased.cshtml'ビューを返すだけです。これはCheckBoxListを持ちます。 CheckBoxListを(ActionMethodを介して)他のビューで再利用したいのですが、それぞれのコードをコピー/ペーストする必要はなく、プライベートメソッドを持って呼び出してください。 – REMESQ

0

あなたはActionResultを返す別のアクションからこのアクションを呼び出すことができます。

public ActionResult OtherAction() 
{ 
    return ModelBased(items, postedItems); 
} 

また、なぜprivate voidですか?あなたは実際にどの部分を再利用したいですか? Itemがあり、ItemsViewModelを返す場合は、private ItemsViewModelである必要があります。再利用する部分によって異なります。 voidは何も返しません。

関連する問題