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 的工作方式是,当您单击要使用的列时,浏览器会返回到服务器以根据新的排序列查找新列表。但是,您的代码正在测试它是否是 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 回答