使用MVC应用程序中的动态参数管理查询

时间:2015-12-01 20:50:59

标签: c# html asp.net-mvc

我正在开发一个Web应用程序,用户可以在其中将查询,锥形字符串和查询参数保存为app数据库中的一行表。稍后,应用程序将提供一个下拉列表,其中包含保存在数据库中的所有查询,用户可以选择要运行的所需查询。

我的问题是,我将使用以下格式进行查询:

select * from table where field = {0} and field = {1}

我将在数据库中有一个列,其中包含每个参数的确切数量和类型,如下所示:“D | N | S”,相应地指示日期,数字或字符串。

在应用程序中,我目前有一个控制器动作,它在一个字符串中检索查询,在另一个字符串中检索参数,所以在控制器中我知道查询有多少和哪种类型的参数,但我不能来有一个很好的解决方案,如何在视图中创建HTML控件,以便用户输入这些参数的值。由于我不知道查询有多少参数,直到控制器从数据库中获取它,我不确定如何继续。

提前致谢。

2 个答案:

答案 0 :(得分:1)

这将有助于您入门:

它将在表单中添加动态输入元素。表单将指向控制器发布操作,该操作将接收 SqlParams 的列表,您可以在那里执行任何操作。

当然,您必须添加验证并根据需要进行调整,它看起来像这样:

服务器:

public class HomeController : Controller
    {

        public class SqlParams 
        {
            public string Name { get; set; }
            public string Value { get; set; }
            public string ParamType { get; set; }

        }

        public ActionResult SQL() 
        {
            return View();
        }

        [HttpPost]
        public ActionResult SQL(List<SqlParams> sqlParams)
        {

            foreach (var item in sqlParams)
            {
                //Do whatever 
                string query = string.Format("{0} = {1}, {2}",item.Name,item.Value, item.ParamType);                
            }

            return View();
        }
}

观点:

<button type="button" onclick="Add();">Click to add param</button>

<form action="@Url.Action("SQL")" method="post">


    <div id="controls">

    </div>

    <button type="submit">Save query</button>
</form>

@section scripts {

    <script>
        var counter = 0;

        function Add() {
            var html = "<label>Parameter Name: </label> <input name='sqlParams[" + counter + "].Name'/> <br/>" +
                       "<label>Parameter Value: </label> <input name='sqlParams[" + counter + "].Value'/> <br/>" +
                       "<label>Parameter Type: </label> <input name='sqlParams[" + counter + "].Type'/> <br/>";
            counter++;

            $("#controls").append(html);
        }

    </script>
    }

答案 1 :(得分:0)

我会有一个查询和参数的类,查询中有一组参数。

public class SomeQueryClassName
{
    public int QueryId { get; set; }
    public string ConnectionString { get; set; }
    public string CommandText { get; set; }
    public List<SomeParameterClassName> Parameters { get; set; }

    public SomeQueryClassName()
    {
        ....
    }
}

public class SomeParameterClassName
{
    public string Name { get; set; }
    public string Description { get; set; }
    public string DataType { get; set; }
    public object Value { get; set; }

    public SomeParameterClassName()
    {
        ....
    }
}

然后在您的控制器中获取查询并返回参数列表作为您的模型。

public ActionResult GetQuery(int queryId)
{
    var query = 
    return View(SomeFunctionToGetTheQuery(queryId).Select(x => x.Parameters).ToList());
}

public ActionResult RunQuery(List<SomeParameterClassName> parameters)
{
    //some server side validation

    //GetQueryResults will add the parameters and execute the query
    return View(GetQueryResults(parameters);
}

然后在视图中

using (Html.BeginForm())
{
    for (int i = 0; i < Model.Count; i++))
    {
        var parameter = Model   [i];     

        <div class="formGroup">
            <div class="labelDivClass">
                <label class="labelClass>@parameter.Description</label>
            </div>
            <div class="inputDivClass">
                <input type="text" name="[i].Value" class="someClassUsedForClientSideValidationBasedOnParameterDataType" />
                <input type="hidden" name="[i].Name" value="@parameter.Name"/>
                <input type="hidden" name="[I].DataType" value="@parameter.DataType"/>
            </div>

        </div>
    }
}

确保在保存/执行查询时,您正在使用参数化查询并添加参数,而不是将值连接到查询中。

using (var connection = new SqlConnection("some connection string"))
{
    connection.Open();

    string cmd = "select * from testable where testcolumn = @testvalue";

    using (var command = new SqlCommand(cmd,connection))
    {
        command.Parameters.AddWithValue("testvalue",somevalue);

        //execute query and return data in a datatable or yield return objects
    }

    connection.Close();
}