Как подсчитать конкретную категорию, когда строка запроса пуста? - PullRequest
1 голос
/ 03 марта 2011

У меня есть меню на главной странице / странице по умолчанию, где я перечисляю x категорий.Я хотел бы подсчитать, сколько продуктов в каждой категории.

EX:

Бананы (20)

Яблоки (8)

Клубника (5)

Пока у меня есть это:

 var listSubMenu = __account.GetAllProductCategories();
 var sb = new StringBuilder();
    for (int i = 0; i < listSubMenu.Rows.Count; i++)
    {
        var r = listSubMenu.Rows[i];

        var catid = Request.QueryString["thespecific_category_id_but_how_do_i_get_it?"];
        var count = __account.GetSpecificCategory(id);

        sb.AppendFormat(String.Format(@"<li{0}><a href='/account/products.aspx?categoryid={0}'>{1} ({2})</a></li>", r["cat_id"], r["cat_name"], count.Rows.Count));

    }
    active_sub_products.Text = sb.ToString();

My DataTable:
public DataTable GetAllProductCategories()
    {
        const string request =
        @"
            SELECT * FROM products_category
            WHERE cat_active = 1
            ORDER BY cat_name ASC
        ";
        using (var query = new MySqlCommand(request))
        {
            return __dbConnect.GetData(query);
        }
    }

Очевидно, мне нужен конкретный categoryid, но как я могу запросить это беззапуск строки запроса, поскольку он находится на странице по умолчанию.Я что-то упускаю из виду?

Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 03 марта 2011

Если я правильно понял схему вашего результата из GetAllProductCategories () ...

["cat_id"] ["cat_name"]

[1] [Яблоки]

[2] [Бананы]

[3] [Апельсины]

var cat_id = r["cat_id"]

или, возможно,

var cat_id = Int32.Parse(r["cat_id"])

Я бы также изменил:

sb.AppendFormat(String.Format(@"<li{0}><a href='/account/products.aspx?categoryid={0}'>{1} ({2})</a></li>", r["cat_id"], r["cat_name"], count.Rows.Count));

Кому:

sb.AppendFormat(String.Format(@"<li><a href='/account/products.aspx?categoryid={0}'>{1} ({2})</a></li>", cat_id, r["cat_name"], count.Rows.Count));

(есть два изменения, (1)в

{правильный синтаксис html} и (2) от r ["cat_id"] до cat_id {у вас уже есть это в переменной и строке. Формат не возражает против преобразования в строку для вас})

Кроме того, я бы посоветовал изучить ORM, такой как LinqToSql, чтобы вы могли работать непосредственно с объектами ...

0 голосов
/ 03 марта 2011

Сначала отобразите ссылки на категории на главной странице:

** Когда вы вызываете GetAllProductCategories, каждая строка результата будет содержать как минимум два столбца (cat_id и cat_name).

Когда вы получаете каждую строку по индексу (var r = listSubMenu.Rows [i]), возвращаемая строка будет иметь cat_id и cat_name для этой записи, я добавил (var name = r ["cat_name"]) для иллюстрации .

Если вы отлаживаете этот шаг и проходите через него, вы должны увидеть, что каждая итерация цикла for дает переменной id идентификатор следующей категории, который затем используется в строке (var count = __account.GetSpecificCategory (id);)

var listSubMenu = __account.GetAllProductCategories();
var sb = new StringBuilder();
for (int i = 0; i < listSubMenu.Rows.Count; i++)
{
    var r = listSubMenu.Rows[i];

    var id = Int32.Parse(r["cat_id"]);
    var name = r["cat_name"];

    var count = __account.GetSpecificCategory(id);

    sb.AppendFormat(String.Format(@"<li{0}><a href='/account/products.aspx?categoryid={0}'>{1} ({2})</a></li>", r["cat_id"], r["cat_name"], count.Rows.Count));

}
active_sub_products.Text = sb.ToString();

Затем в другое текстовое поле или область реальной страницы "products.aspx"

var sbProducts = new StringBuilder();
var selectedCat = Request.QueryString["categoryid"];

if(!string.IsNullOrWhitespace(selectedCat))
{
    var selectedCatId = Int32.Parse(selectedCat);
    var products = __account.GetSpecificCategory(selectedCatId);

    for(int j = 0; j < products.Rows.Count; j++)
    {
         // ... do product listing stuff here
         // sbProducts.Append(...);
    }
}
else
{
    sbProducts.AppendLine("Invalid Category Id Selected!");
}
active_selected_products.Text = sbProducts.ToString();

** Примечание: когда вы вызываете Request.QueryString ["value"], оно будет либо:

  1. Возвращает значение NULL, указывающее, что нет параметра строки запроса с совпадающим именем

    или

  2. Возвращает строку, представляющую содержимое между значением = и концом URL или следующим & найдено.

** это не полностью производственный код качества, необходимо выполнить дополнительные проверки значения строки запроса, например, перейти к tryparse, проверить количество возвращаемых продуктов и показать «Продукты не найдены для этой категории». .. и т. д. **

0 голосов
/ 03 марта 2011

Вы должны просмотреть свои категории и получить оттуда идентификатор.Не из строки запроса, поскольку она относится к вашей странице (как вы сами написали).

Учитывая ваш пример, я ожидаю, что __account.GetAllProductCategories () вернет уже необходимые вам идентификаторы

В этом случае вы бы использовали что-то вроде

var catid = listSubMenu.id;

Но идентификатор зависит от типа того, что возвращает ваш __account.

...