0

WebGrid を使用して、次の結果を表示します。

select * from table where column like '**';

結果表示には問題ありません。

ただし、WebGrid の列名をクリックして結果を並べ替えると、エラーが発生するか、ページに何も表示されません。

WebGrid の並べ替えを機能させるにはどうすればよいですか??

    @{
        Layout = "~/_SiteLayout.cshtml";
        Page.Title = "Test"; 

        var value = "";
        var sqlquery = "";
        var isvalid = true;
        var searchaskey = "";
        var grid = new WebGrid();

        if(IsPost)
        {
            value = Request.Form["input"];
            if(string.IsNullOrEmpty(value))
            {
                isvalid = false;
            }
            if (isvalid)
            {
                searchaskey = "'%" + value + "%'";
                sqlquery = "select * from joblist where JobCategory like " + searchaskey;
                var db = Database.Open("StarterSite");
                grid = new WebGrid( db.Query(sqlquery));
            }
        }
    }


<form method="post" action="Test.cshtml">
@value
@sqlquery
<div>
<input name="input" type="text" value=@value>
<button type="Submit">Submit</button>
</div>
</form>

    @{
        if(IsPost)
        {
            @grid.GetHtml(
                columns:grid.Columns(
                    grid.Column(columnName : "JobTitle",header:"  Job Title  "),
                    grid.Column(columnName : "JobCategory",header:"  Job Category  "),
                    grid.Column(columnName : "CompanyName",header:"  Company Name  "),
                    grid.Column(columnName : "PostedOn",header:"  Post Date  ")
                )
            )
        }
    }
4

1 に答える 1

0

webGridが機能する方法は、再利用する列をクリックすると、ブラウザーはサーバーにGETを返し、新しい並べ替え列に従って新しいリストを検索します。ただし、コードはそれがPOSTであるかどうかをテストしており、投稿でない場合は結果を返しません。

この問題を修正するには、POSTでコードが検索基準を保存して、後続のGETで検索基準を使用できるようにする必要があります。あなたはこれをします

Session["MySavedSearchAsKey"] = searchaskey;

次に、GETがある場合、Session["MySavedSearchAsKey"]に何かが含まれているかどうかを確認します。含まれている場合は、先に進んでクエリを実行し、webGridを生成します。空の場合は、何もしないでください。

最後に、コード行

sqlquery = "select * from joblist where JobCategory like " + searchaskey;

このようなSQLの行を作成しないでください。このタイプのコードをSQLインジェクション攻撃で攻撃するのは簡単です。その代わり、

sqlquery = "select * from joblist where JobCategory like %0";

results = db.Query( sqlquery, searchaskey);

これはパラメータ化されたSQLと呼ばれ、コードからデータベースと通信するための安全な方法です。%0は、Queryステートメントで渡したパラメーターに置き換えられるため、クエリとまったく同じように機能しますが、非常に安全な方法で実行されます。

幸運を!

于 2012-05-10T11:41:33.707 に答える