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. 私が正しくしていない、まったく違う何か。

どんな例でも大歓迎です。

編集:上記のコードは CheckBoxList で動作します。これは特定の CheckBoxList の 1 つです。しかし、コードをコピーして他のビューに貼り付けることなく、他のビューで使用できるようにしたいと考えていますActionResultsActionResult他のことをするつもりなので、電話するだけではうまくいきません。特に、次ActionResultのようなウィザードのコードがそれぞれにあります。

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

特定のビューを返すため、ActionResult何かが欠けていない限り、呼び出しだけでは機能しません。

4

3 に答える 3

1

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);
}
于 2012-02-17T22:13:26.317 に答える
0

あなたの例は不明確ですが、私は通常、共通の機能を別のメソッドに移動し、[NonAction]属性でマークします。例えば

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

次に、アクションメソッドでGetUserInfoを呼び出します。

編集:

部分的なビューを調べる必要があります。部分ビューは、複数のページで再利用できるコントロールと考えることができます。たとえば、ログインコントロールを部分ビューに配置して、複数のページに配置することができます。これにより、コードの再利用が促進されます。

しばらくこれを行っていないため、例を示すことはできませんが、次のことを行う必要があります。

  1. return View();あなたの代わり にreturn PartialView("_NameOfYourPartialView", viewModel);
  2. ビューを変更して、ビューではなく部分的なビューになるようにします。

少し読んで、自分で試してみる必要があります。

幸運を

于 2012-02-17T23:43:00.240 に答える
0

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

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

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

于 2012-02-18T04:24:10.763 に答える