1

MVC アプリを作成していて、フォームを送信したいと考えています。だから私はこのような簡単なことをしました。「DisplayItems」ビューは次のとおりです。

@model List<MyApp.Models.Inventory>

@{
    ViewBag.Title = "Display Items";
}

@using (Html.BeginForm())
{
    <table>
        <tr>
            <th>Object Name</th>
            <th>Number In Stock</th>
            <th>Quantity To Send</th>
            <th>Reserved for First Template</th>
            <th>Reserved for Second Template</th>
            <th>Reserved for Third Template</th>
            <th>Number so far</th>
            <th>Input quantity</th>
        </tr>
        @for (int i = 0; i < Model.Count(); i++)
        {
            <tr>
                <td>@Html.DisplayFor(_x => _x[i].m_Obj.m_ObjName)</td>
                <td>@Html.DisplayFor(_x => _x[i].m_QtyToSendShow)</td>
                <td>@Html.DisplayFor(_x => _x[i].m_NbInStock)</td>
                <td>@Html.DisplayFor(_x => _x[i].m_QtyFirstTemplate)</td>
                <td>@Html.DisplayFor(_x => _x[i].m_QtySecondTemplate)</td>
                <td>@Html.DisplayFor(_x => _x[i].m_QtyThirdTemplate)</td>
                <td>@Html.DisplayFor(_x => _x[i].m_QtyHold)</td>
                <td>@Html.TextBoxFor(_x=>_x[i].m_QtyToSend)</td>
            </tr>
        }
    </table>
    <input type="submit" name="_submitButton" value="Confirm"/>  
}

特別なことは何もありません。ただし、ユーザーが「確認」ボタンをクリックすると、アプリケーションは、ユーザーが検索を指定するためのフィルター エンジンである PREVIOUS ビューに戻り続けます。

「SendItems」という名前の以前のビューを次に示します。

@{
    ViewBag.Title = "Send items";
}

<h2>Send Items</h2>

<p>
    @using (Html.BeginForm())
    {
        Html.RenderAction("AdvancedSearch", "PartialViews");
    }

    @Html.ActionLink("Back to Selection", "MenuSelection")
</p>

部分ビューは、多くのフィールドと入力ボタンを持つモデルにバインドされたビューです。ボタン入力がクリックされると、コントローラー メソッドは次のようにヒットします。

public ActionResult SendItems(SearchEngineObject _searchObj, string _submitButton)
{
    if (_submitButton == "Search")
    {
        bool isValid = ValidateSearchFields(_searchObj);

        if (!isValid)
        {
            ViewData["ErrorMessage"] = m_MessageError;

            return View();
        }

        m_ListToManage = m_InventoryManager.ListAvailableInventoryItems(_searchObj);

        if (m_ListInventoryToManage.Count == 0)
        {
            ViewData["ErrorMessage"] =
                "There are no inventory items belonging to the parameters you selected; " +
                "please change your values and try again.";

            return View();
        }

        return View("DisplayItems", m_ListInventoryToManage);
    }

    return View();
}

したがって、SendItems ビューからの入力ボタンがヒットすると、コントローラーはフィールドを検証し、フィルターに基づいて在庫アイテムのリストを取得し、それを「DisplayItems」ビューに送信します。

しかし、ビューに新たに到着し、「確認」ボタンをクリックすると、「SendItems」ビューに直接戻りますが、「DisplayItems」コントローラーメソッドに移動したいです。なんで?誰かが私が間違ったことを説明できますか?

編集

簡単なデバッグ セッションを行ったところ、デバッグによって「DisplayItems」メソッドではなく、「Send Items」コントローラー メソッドに戻ることが確認できました。

4

2 に答える 2

1

アクションメソッドごとに複数の割り当てを避けるために物事を整理することについて話しましょう。

モデルが正しいかどうかわかりませんが、アイテムのリストがありユーザーに 1 つのアイテムを選択して詳細を表示してもらいたいとしましょう。

UPDATE :POST Listリストをフィルタリングするために があります。

サーバー側は次のようになります。

public class ItemController : Controller
{
  public ActionResult List()
  {
    //fetch from db
    return View(yourViewModel);
  }

  [HttpPost]
  public ActionResult List(string firstLilPig, int secondLilPig, string thirdLilPig)
  {
    //fetch from db using the little pigs as filters
    return View(yourViewModel);
  }

  public ActionResult Details(int id)
  {
    //fetch one item using the id
    return View(theItemViewModel);
  }
}

これを行うと、 /Item/List.cshtml/Item/Details.cshtmlの2 つのビューが作成されます。の 3 番目のビューはありませんPOST List。同じ /Item/List.cshtml を使用します。変更点はビュー モデル(渡すデータ) です。

最後に、ブラウズ/ハイパーリンクする URL は次のようになります。

  • http://.../item/list
  • http://.../item/details/1

アップデート

ユースケースに応じて、次の構造をお勧めします。

検索
方法:GET
パラメータ: なし
ビュー: 検索

リスト
メソッド:POST
パラメータ: フィルタ基準
ビュー: 結果が空の場合はリストまたは検索

リクエスト
メソッド:POST
パラメータ: アイテム ID と数量のリスト (結果テーブルから)
ビュー: なし。データをデータベースに保存し、結果にリダイレクトします。

結果
メソッド:GET
パラメータ: なし
ビュー: 結果。前のリクエストの結果を表示します

ノート:

  1. 順序は、検索 > リスト > 要求 > 結果です。リストは検索にリダイレクトされる場合があります
  2. Request > Result はPRGの原則に従います。このようにして、ユーザーが結果ページで F5 を押しても、リクエストは再送信されません。
  3. Request のビュー モデルを作成する必要があります。プロパティとして ItemID と Quantity を持つ ItemRequest の配列があります。
于 2013-05-16T14:54:33.087 に答える
1

私はこれでベースから外れているかもしれませんが、できることの 1 つは、アクション メソッドに[HttpGet]andでタグ付けすることです。これにより、次のように、元のページかフォームバック[HttpPost]かに応じて実行が異なるパスをたどります。getpost

public class HomeController : Controller
{
    // The original page render will go here
    [HttpGet]
    public ActionResult Index()
    {
        return View(new MyModel());
    }

    // The form postback will go here
    [HttpPost]
    public String Index(MyModel model)
    {
        return "Something";
    }
}

これは、通常の HTML を使用した単純なモックアップです。

<div>
    <form method="post">
        <input type="text" name ="FirstName" value ="@Model.FirstName" />
        <input type="submit" value="submit" />
    </form>
</div>

ただし、(メソッドをデフォルトの 'get'ではHtml.BeginFormなく 'post' に設定する)でも同じことを実際に行うことができます。ただし、get タグの代わりに post タグを使用します。postget

于 2013-05-16T14:58:15.607 に答える