![](/img/trans.png)
[英]How to pass values of the current model details to controller action in asp.net mvc when checkbox is checked
[英]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的對象。 如果將其序列化為字符串,則按照以下方式存儲它的效率和便捷性較低。
假設您有一個“人”表,並且要檢查他們擁有的“控制台”列表。
您將擁有餐桌人物 :
和表控制台
和存儲控制台所擁有的表:
owned_console
在您的代碼中,您將為每個選中的復選框插入一條記錄。
人:
安慰:
owned_console:
(1)(3)
(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.