0

私はDatabaseオブジェクトを持っています。各オブジェクトはディスク上のファイルを表します:

これは私のオブジェクトです:

public class MyObject
{
    public int id { get; set; }
    public string fileName { get; set; }
    public string browser { get; set; }    
    public string protocol { get; set; }    
    public string family { get; set; }
}

私のメインページではDropDownList、プロトコルプロパティでソートされたすべてのファイルを含むページにつながるボタンをクリックしています。これは、特定のオブジェクトのコレクションを返すコントローラーですfamily(私のオブジェクト プロパティ):

私のコントローラー:

    public ActionResult Index()
    {
        var list = db.Captures.Where(x => x.family == "Web").ToArray();
        list = list.Distinct(new MyObjectByProtocolComparer())
                   .OrderBy(x => x.fileName)
                   .ToArray();            

        ViewBag.Files = list;
        return View();
    }

そして、私のプロトコルリストを表示する私のIndex.cshtml:

<div>

        @Html.DropDownList("File", new SelectList(ViewBag.Files, "Id", "protocol_site"), "Select webmail site", new { style = "vertical-align:middle;" })
        <button type="button">Select</button>
    </div>

追加したいのですが、特定のプロトコルファイルを選択DropDownListしてボタンをクリックすると、この特定のプロトコルを持つすべてのファイルが一覧表示されます。この記事を読みましたが、これが必要かどうかわかりません。デフォルトのMVCWeb ページには [削除]、[作成]、および [詳細] のリンクがありますが、別のものが必要です。新しいボタンを追加し、アイテム名を自分から読み取りDropDownList、データベースの結果を表示するだけですオーバーリスト。誰かが良いチュートリアルに精通しているなら、私は喜んで学びます。誰かが私の仕事をしてくれることを望んでいません。これは私のスタイルではありません。もちろん、これは私MVCが理解するのに役立ちませんが、私が新しいWebconsole\winforms の代わりに、これは非常に紛らわしく不明確に見えます (デザインと html を含むコード)

4

2 に答える 2

0

フォームで包みます<div>

@using (Html.BeginForm()) {
<div>
    @Html.DropDownList("File", new SelectList(ViewBag.Files, "Id", "protocol_site"), "Select webmail site", new { style = "vertical-align:middle;" })
    <button type="button">Select</button>
</div>
}

POSTコントローラーにリクエスト ハンドラーを実装します。

[HttpPost]
public ActionResult Index(string File)
{
    ...
}

プロトコルに一致するファイルのリストを含むビューに戻るかリダイレクトするコードを記述します。

于 2013-11-10T19:14:42.577 に答える
0

ボタン「選択」は、MVC .cshtml ビューにある html FORMタグでラップする必要があります @Html.BeginForm() 拡張メソッドでレンダリングできます (ヘルプを参照)。HTMLフォームを作成したら、このボタンを「送信」タイプに設定することで、ユーザーがそれをWebサーバーに投稿できるようにすることができます。ユーザーがそれを押すと、ブラウザーは、 inputselectなどの FORM 内にあるがlabelなどではないhtml 要素の名前と値を収集し、それらをキーと値のペアに変換し、HTTP POST 要求を介して FORM として指定された URL に Web サーバーに送信します。属性 ( http://myHost.com/Foo/Barなど)。
Web サーバーはこの要求を受け取り、それを解析します - URL クエリ文字列、ヘッダー、そしてもちろん、投稿されたデータの両方。MVC の規則とデフォルトのルーティングによると、http://myHost.com/Foo/Barすべてのリクエスト データを Foo コントローラーの Bar アクションに転送する必要があることを意味します。アクション プログラム内では、HttpContext.Request.Form コレクションを介して FORM の値 (および他の多くの要求情報) にアクセスできます。しかし、.NET MVC 実装のもう 1 つの優れた点は、モデル バインディング メカニズムです。キーとパラメーター名の同等性に基づいて、受信 FORM のキーと値のペアを Action パラメーターにマップしようとします (実際には、さらに複雑です)。したがって、ページに /select name="myDdlId"/ html タグがあり、ユーザーが Id=123 の最初のオプションを選択してフォームを送信した場合、受信 FORM キーと値のペアは "myDdlId=123" になります。Bar アクションにint myDdlIdを指定したらパラメータの場合、キーとパラメータ名が等しいため、バインダーは自動的に「123」を入力します。アクションで使用できるのは単純型のパラメーターだけではありません。実際には、MyDdlId 整数プロパティを使用して独自の MyModel クラスを作成できます。バインダーはオブジェクトをインスタンス化し、その MyDdlId=123 を設定します。デフォルトのバインダーは非常にスマートでほとんどのニーズに対応していますが、独自のバインダーを作成することもできます。
このように、暗黙的なバインディングは、FORM 値のコレクションやキーと値のペアを考えなくて済むように非常に役立ちます。特別に設計されたオブジェクトをパラメーターとして Action に提供するだけで、出来上がりです! - このオブジェクトに対応する値をすぐに入力します。
選択したアイテムの ID を取得し、データベースに対してクエリを実行すると、エンティティがユーザーに表示されます。エンティティ配列を保持できる MyEntitiesViewModel のような別のビュー モデル クラスが必要です。データベースから非常に大きなビジネス エンティティを取得したら、MyEntitiesViewModel のインスタンスmyEntitiesModelを作成し、必要なエンティティ プロパティを設定します。その後、return View("~/Views/AllEntities.cshtml", myEntitiesModel); と記述します。つまり、AllEntities.cshtmlテンプレートを取得し、それに myEntitiesModel を提供し、html ページとしてレンダリングして、クライアントに送り返します。
これは役に立ちましたか?

于 2013-11-10T19:03:16.467 に答える