簡體   English   中英

如何使用ASP.NET MVC在數據庫中存儲多個選中的Checkbox值

[英]How to store multiple checked Checkbox values in DB using ASP.NET MVC

我正在使用ASP MVC和存儲過程(SQL Server)開發一個項目,我想將選中的復選框項存儲在數據庫中。 我試圖在模型中添加List<string>類型,以便訪問這些值,然后將其存儲在數據庫中。

關系數據庫專門設計為每行/列組合存儲一個值的問題。 為了存儲多個值,我必須將列表序列化為單個值進行存儲,然后在檢索時將其反序列化。

那就是我的視圖標記:

               <h6>Items</h6>
                    <ul>
                        <li>
                            <label class="anim">
                                <input type="checkbox" class="checkbox" value="Soups" name="Items">
                                <span>Soups</span>
                            </label>
                        </li>
                        <li>
                            <label class="anim">
                                <input type="checkbox" class="checkbox" value="Burger" name="Items" >
                                <span>Burger</span>
                            </label>
                        </li>
                        <li>
                            <label class="anim">
                                <input type="checkbox" class="checkbox" value="Drinks" name="Items">
                                <span>Drinks</span>
                            </label>
                        </li>
                        <li>
                            <label class="anim">
                                <input type="checkbox" class="checkbox" value="Desserts" name="Items">
                                <span>Desserts</span>
                            </label>
                        </li>
                    </ul>

方法AddBestellung

try
{
    using (SqlConnection con = new SqlConnection(Connection()))
    {
        using (SqlCommand cmd = new SqlCommand("AddNewBestellung", con))
        {
            foreach(var item in bs.Items)
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Items", item);
            }

            // Another saved parameters...

            con.Open();
            int i = cmd.ExecuteNonQuery();
            con.Close();

            if (i >= 1)
                return true;
            else
                return false;
        }
    }
}
catch(Exception ex)
{
    string e = ex.Message;
    return false;
}

private static string Connection()
{
    return ConfigurationManager.ConnectionStrings["deliverycon"].ToString();
}

模型:

public List<string> Items { get; set; }

您不應該序列化/反序列化。 以后使用起來會很痛苦。

想象一下,您需要檢索已選中項目1和5的對象。 如果將其序列化為字符串,則按照以下方式存儲它的效率和便捷性較低。

假設您有一個“人”表,並且要檢查他們擁有的“控制台”列表。

您將擁有餐桌人物

  • id int主鍵
  • 名稱varchar不為null

和表控制台

  • id int primary_key
  • 名稱varchar不為null

和存儲控制台所擁有的表:

owned_console

  • id int主鍵
  • person_id int(外鍵=> person(id))
  • console_id int(外鍵=> console(id))

在您的代碼中,您將為每個選中的復選框插入一條記錄。

人:

  • (1)托馬斯
  • (2)皮爾

安慰:

  • (1)NES
  • (2)MEGADRIVE
  • (3)NEOGEO

owned_console:

  • (1)(1)
  • (1)(2)
  • (1)(3)

  • (2)(1)

  • (2)(1)

然后,您可以執行以下操作:

SELECT * 
FROM   person p
INNER  JOIN owned_console oc
ON     p.id = oc.person_id
WHERE  oc.console_id IN (3,1);

標志枚舉-

[Flags]
public enum ItemStorage
{
    Soups = 1,
    Burger = 2,
    Drinks = 4,
    Dessert = 8,
    Cheese = 16
}

我添加了Cheese只是為了強調Flags枚舉的二進制性質。

這是您的其他代碼-

public class Stuff
{
    private List<string> Items;
    private static string Connection()
    {
        return ConfigurationManager.ConnectionStrings["deliverycon"].ToString();
    }

    public bool DoStuff()
    {
        try
        {
            using (SqlConnection con = new SqlConnection(Connection()))
            {
                using (SqlCommand cmd = new SqlCommand("AddNewBestellung", con))
                {

                    cmd.Parameters.AddWithValue("@Items", (int)ConstuctEnumValueFromList(Items));
                    //other saved parameters...

                    con.Open();
                    int i = cmd.ExecuteNonQuery();
                    con.Close();

                    if (i >= 1)
                        return true;
                    else
                        return false;
                }
            }
        }
        catch (Exception ex)
        {
            string e = ex.Message;
            return false;
        }
    }

    private ItemStorage ConstuctEnumValueFromList(List<string> list)
    {
        var result = new ItemStorage();
        if (list.Any())
        {
            var separatedList = string.join(",", list)
            bool success = Enum.TryParse<ItemStorage>(separatedList, out result)
        }
        return result;
    }
}

在這種情況下,您可以簡單地將Items字段存儲為單個整數,並在檢索時將其轉換回ItemStorage,如下所示:

int i = 1 + 2 + 4 + 8;
var items = (ItemStorage)i;
Console.WriteLine(items.ToString());

這應該給您“湯,漢堡,飲料,甜點”;

XML序列化

首先,請確保您熟悉本文檔 此方法要求您將Items集合存儲到SQL Server中的XML列。 如果您不擔心SQLXML和XPath,它還有一個優點是可以針對該列進行查詢。 有很多開發人員。

一旦有了它,一切看起來都非常相似(如果簡單一點)。

public class Stuff
{
    private List<string> Items;
    private static string Connection()
    {
        return ConfigurationManager.ConnectionStrings["deliverycon"].ToString();
    }

    public bool DoStuff()
    {
        try
        {
            using (SqlConnection con = new SqlConnection(Connection()))
            {
                using (SqlCommand cmd = new SqlCommand("AddNewBestellung", con))
                {

                    cmd.Parameters.AddWithValue("@Items", ConstructXmlFromList(Items));
                    //other saved parameters...

                    con.Open();
                    int i = cmd.ExecuteNonQuery();
                    con.Close();

                    if (i >= 1)
                        return true;
                    else
                        return false;
                }
            }
        }
        catch (Exception ex)
        {
            string e = ex.Message;
            return false;
        }
    }

    public static T FromXML<T>(string xml)
    {
        using (var stringReader = new StringReader(xml))
        {
            var serializer = new XmlSerializer(typeof(T));
            return (T)serializer.Deserialize(stringReader);
        }
    }

    public string ToXML<T>(T obj)
    {
        using (var stringWriter = new StringWriter(new StringBuilder()))
        {
            var xmlSerializer = new XmlSerializer(typeof(T));
            xmlSerializer.Serialize(stringWriter, obj);
            return stringWriter.ToString();
        }
    }

    private string ConstructXmlFromList(List<string> list)
    {
        return ToXML(list);
    }
}

同樣,很容易將XML片段重新水化為您開始使用的List<string> 您只需使用

var myList = FromXML<List<string>>(fieldValue);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM