带有Select * Like *的WebGrid

时间:2012-05-09 06:34:11

标签: sql razor webmatrix webgrid

我使用WebGrid显示结果:

  

从表中选择*,其中列为'**';

显示结果没有问题。

但是,如果我单击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  ")
                )
            )
        }
    }

1 个答案:

答案 0 :(得分: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语句中传递的参数,因此它与查询完全相同,但只是以非常安全的方式。

祝你好运!