コントローラー内での ActionResult コードの再利用
-
27-10-2019 - |
質問
次のコードがある場合 (編集:明確でなかったら申し訳ありませんが、以下をカプセル化して(呼び出し元のビューのことは忘れてください)、その中で他のことをできるようにしたいのです。 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);
}
コピー/ペーストせずに、コントローラーのさまざまなアクションでそれを再利用するにはどうすればよいですか。コードでプライベートメソッドを実行してみました。しかし、私は次のことに行き詰まっています:
アクションメソッド内でそれを間違って呼び出しているかのどちらかです。
private void Item (Item item) {//copied code from above}
それから電話するItem(item);
行動の中で。またはそれは何かと関係があります
(string[] items, PostedItems postedItems)
私が間違ったことをしていること。または私が正しくやっていない、まったく異なる何か。
例をいただければ幸いです。
編集: 上記のコードは CheckBoxList で動作します。それは 1 つの特定の CheckBoxList です。しかし、コードを他のビューにコピー/ペーストすることなく、他のビューで使用できるようにしたいと考えています。 ActionResults
. 。ただ電話をかけるだけで、 ActionResult
他のことをするつもりなのでうまくいきません。特に、それぞれにウィザードのコードがあります。 ActionResult
, 、 のような:
if ((nextButton != null) && ModelState.IsValid)
return RedirectToAction("EMailConfirm");
return View("EMail/BasicDetails", myData);
これらは特定のビューを返しているため、 ActionResult
何かが欠けていない限り、機能しません。
解決
return View(model);
元のアクションのビューを見つけようとします。
特定 return View("ModelBased", 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);
}
他のヒント
あなたの例は不明確ですが、私は通常、共通の機能を別のメソッドに移動し、[NonAction]属性でマークします。例: ジェネラコディセタグプレ
次に、アクションメソッドでGetUserInfoを呼び出します。
編集:
部分的なビューを調べる必要があります。部分ビューは、複数のページで再利用できるコントロールと考えることができます。たとえば、ログインコントロールを部分ビューに配置して、複数のページに配置することができます。これにより、コードの再利用性が促進されます。
しばらくこれを行っていないため、例を示すことはできませんが、次のことを行う必要があります。
-
return View();
の代わりに、return PartialView("_NameOfYourPartialView", viewModel);
を作成する必要があります - ビューを変更して、ビューではなく部分的なビューになるようにします。
少し読んで、自分で試してみる必要があります。
頑張ってください
このアクションは、ActionResult
を返す別のアクションから呼び出すことができます。
ジェネラコディセタグプレ
また、なぜprivate void
なのですか?実際にどの部分を再利用したいですか?それがItem
を取り、ItemsViewModel
を返す場合、それはprivate ItemsViewModel
である必要があります-再利用したい部分によって異なります。void
は何も返しません。