2

如何根据 SQL Server 数据库中定义的标记在 div 中生成控件?可能吗?如果是,那么如何?谁能给我资源?

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication2.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:Literal ID="lit" runat="server" ClientIDMode="Static" Mode="Transform"></asp:Literal>
    </div>
    </form>
</body>
</html>

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication2
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            SqlConnection _newConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

            SqlCommand storedProcedure = new SqlCommand("sp_getMarkup", _newConnection);
            storedProcedure.CommandType = CommandType.StoredProcedure;

            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter(storedProcedure);

            _newConnection.Open();
            da.Fill(ds);
            _newConnection.Close();

            DataTable dt = ds.Tables["Table"];
            string s = (from str in dt.AsEnumerable()
                       where str.Field<int>("Id").Equals(1)
                       select str.Field<string>("elemMarkup")).SingleOrDefault().ToString();

            this.lit.Text = s;
        }
    }
}

在数据库中,我将字符串存储为

<asp:CheckBox ID="chk" runat="server" ClientIDMode="Static" />

现在的问题是控件在页面上呈现但不可见。我可以在查看源代码中看到它。

谁能帮我?

4

3 回答 3

1

您可以使用ParseControl接受字符串并动态创建控件。

缺点是如果服务器代码在字符串中,它将不会被执行。此外,您需要手动附加事件,例如按钮单击事件。

例如,

<script runat="server">
    // This server code will not be executed 
</script>
于 2013-07-09T19:00:43.440 回答
0

这是另一个使用 jquery ajax 从数据库加载信息的SO 问题

我建议有某种类型的sanitizing中介;否则,您将面临跨站点脚本 (XSS) 问题。

于 2013-07-09T18:49:46.813 回答
-1

您可以像这样在页面上使用占位符:

<body>
    <form id="form1" runat="server">
    <div>
        <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
    </div>
    </form>
</body>

在您的代码中,您可以进行多项检查(所有这些检查都包含查询数据库中数据的 SQL 语句)。数据库可以包含一个包含组件名称的字段,例如复选框、按钮(各种其他控件)。这可以节省您在数据库字段中存储标记的时间。

代码外观的非常粗略的表示..

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
    // SQL Code here

    // Datatable code here 
    // End of DataTable code

    // Beginning of IF blocks   
        If (DataTable.Rows.Count > 0) {
        If (your check != "checkbox") {
        this.PlaceHolder1.Controls.Add(new Button(){
            Text = "Added"}
            }
          }
     // More if statements here
       );

    }
}

或者,如果您坚持将 asp 标记存储在数据库中,那么您可以使用循环将 asp 标记输入占位符(如果数据库中有不止一行)

于 2013-07-09T18:51:38.753 回答