我使用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 ")
)
)
}
}
答案 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语句中传递的参数,因此它与查询完全相同,但只是以非常安全的方式。
祝你好运!