WebMatrix - 如何定义初始变量以保持db.query()返回结果而不会超出范围或null类型异常错误?

时间:2014-10-07 01:20:10

标签: c# sql-server-2008 razor webmatrix

我需要根据用户选择从下拉菜单中显示结果。菜单本身用" jobquery"动态填充。

我写了以下代码:

@{
    var db = Database.Open("database");
    String jobquery = "select description from match_jobs";
    IEnumerable<dynamic> data = null;
    var grid = new WebGrid(data, canPage: false);  

if(IsPost)
   {
    var description = Request["job"];
    String sql = "select top 30 * from match_@0_output";
    data = db.Query(sql, description); 
    }
}

然后在html中,我有

        <div id="dynamic">
        Select Job
        <form name = "search" method="post">
        <select name="job">
        <option value="" selected disabled>Select Job</option>
        @foreach (var row in db.Query(jobquery))
        {
            <option value="@Request["job"]">@row.description</option>
        }
        </select>
        <input type="submit" value="@Request["job"]"/>    
        </form> 
        </div>

下拉菜单工作正常。但是,我无法打电话 @ grid.GetHtml(); - &GT;必须先绑定数据源才能执行此操作。

我试过

    </tr>
    @foreach (var row in data)
    {<tr>
        <td>@row.columnname</td>
     </tr>
    }

也没有工作。 - &GT; NullOperation异常

我用Google搜索了整整一周并进行了大量失败的实验。我现在已经结束了;专业的帮助将不胜感激。谢谢......

1 个答案:

答案 0 :(得分:0)

在代码的第一部分中,您为数据声明了一个变量,但根本不查询数据库。我不完全清楚你想要做什么,但如果你想用数据填充网格,你应该查询数据库:

var db = Database.Open("database");
var jobquery = "select description from match_jobs";
var data = db.Query(jobquery);
var grid = new WebGrid(data, canPage: false);  

然后在“html”中,您不需要再次查询数据库 - 您可以重新使用已保存数据的变量:

<div id="dynamic">
Select Job
<form name = "search" method="post">
<select name="job">
<option value="" selected disabled>Select Job</option>
@foreach (var row in data)
{
    <option value="@Request["job"]">@row.description</option>
}
</select>
<input type="submit" value="@Request["job"]"/>    
</form> 
</div>

IsPost条件中的代码段完全没有意义。您查询数据库然后调用Response.Redirect - 告诉浏览器请求不同的页面。当您执行此操作时,将丢弃当前页面中的所有值 - 包括刚刚检索到的数据。