【问题标题】:how to get value from dropdown control in asp.net in this scenario?在这种情况下,如何从 asp.net 中的下拉控件中获取值?
【发布时间】:2011-03-09 18:23:19
【问题描述】:

我的情况是这样的: 我有 asp.net 页面,其中包含产品列表的下拉控件。在数据库中,我的产品表具有 ProductId、产品名称和价格等字段。我用这种方法填充了这个下拉控件:

   private void FillProducts()
            {

            List<Product> productList = objProductManager.GetProducts();
            if (productList.Count > 0)
                {
                drpProducts.DataSource = productList;
                drpProducts.DataTextField = "ProductName";
                drpProducts.DataValueField = "ProductId";

                drpProducts.DataBind();
                }
            }

这是完美的工作。但我想在客户端获得选定的产品价格值。为此,我不想在服务器上往返来获得它。除了 DataTextFeild 或 DataValueField 之外,下拉控件的任何属性是否可以保存产品的价格字段?这样我就可以避免回到服务器。或者建议任何补救措施。 请指导我。

【问题讨论】:

  • 您可以将ProductId替换为产品价格并在javascript中获取下拉列表的SelectedValue
  • 非常有趣....!如果我会使用产品 id 实际上产品 id 和名称在后面的代码中使用。

标签: c# asp.net drop-down-menu


【解决方案1】:

这就是全局变量会话变量发生的地方...

Web 环境中,您可以同时拥有、跨用户的全局变量(您可以在其中缓存整个产品列表)或在会话中变量,您只能用于该用户会话。

你的方法看起来像:

public MyPMan objProductManager = new MyPMan();

public List<Product> ProductList 
{
    get
    {
        if(Session["MyApp-ProductList"] == null)
            Session["MyApp-ProductList"] = objProductManager.GetProducts();
        return (List<Product>)Session["MyApp-ProductList"];
    }
}

private void FillProducts()
{

    //List<Product> productList = objProductManager.GetProducts();
    if (this.ProductList.Count > 0)
    {
        drpProducts.DataSource = this.ProductList;
        drpProducts.DataTextField = "ProductName";
        drpProducts.DataValueField = "ProductId";

        drpProducts.DataBind();
    }
}

您可以轻松地在提交或任何操作时获取价格

double p = this.ProductList.Where(x => x.ID.Equals(12)).Price;

这样,您每次会话只需查询一次数据库,并且它在整个网站上都可用,我的建议是您创建一个静态业务对象,以便在任何地方都可用,而且很简单:)

例如,您可以将其作为第一行

if (MyStaticObject.ProductList.Count > 0)

如果您想拥有跨会话和用户的产品列表,请使用 Application 变量并将其设置在 global.asax 文件中。


添加

如何使用这个进行客户端验证:

我喜欢 jQuery Validation,因为它是最简单、最出色的客户端验证工具,非常酷,甚至微软现在也在 ASP.NET MVC 2 和 MVC3 中使用它;)

您可以轻松地将值从 ASP.NET 传递到 Javascript

var myJavaScriptVariable = '<%= myAspVariable %>';

相反的方法更棘手;)

您可以轻松传递 JSON 并使用该 JSON 字符串,我建议Json.NET

或者您可以使用 ASP.NET WebForms 中的内置验证...请提供您在表单中执行的操作(Repeater、GridView、List),以便为您提供准确的代码。


添加(第 2 部分)

要将您的产品列表转换为 javascript 中的 Json 数组,您可以这样做:

在 ASP.NET MVC 3 中

var jsonMVC = @Html.Raw(Json.Encode(reg));

在 ASP.NET WebForms 中(使用 JSon.NET)

var jsonWebForms = <%= Newtonsoft.Json.JsonConvert.SerializeObject(MyStaticObject.ProductList) %>;

然后您可以轻松访问所有对象,例如:

var product = jsonMVC[0];
alert(product.Price);

还有更多技巧,但我希望这些技巧有所帮助。

请记住,我仍然强烈建议您使用内置的 ASP.NET 控件验证,因为如果您使用 gridviewuse @987654332,那么您将立即使用它@Event 来积累你的东西。

【讨论】:

  • 我印象深刻,我认为这是一个很好的解决方案。但我在这里使用这个价格进行验证。就像还有另一个文本框一样。如“支付金额”和“产品数量”。在这里我想检查填充的金额是否应该完全等于输入产品数量的倍数的价格。假设一支笔是 10 美元,笔数是 4,那么他必须在那里填写 40 美元。像这种情况。我知道我可以通过 java 脚本进行自定义验证。但另一个问题是如何在 javascript 中访问应用程序变量/会话变量?你明白我的意思了吗?
  • 添加了客户端验证想法,因为我不知道你在做什么。
  • 算了,告诉我如何在javascript中访问保存产品列表的Session变量?
  • 添加了如何创建产品列表的 JSON 对象。
  • 不知何故我无法在我的 javascript 中访问 Session 值,得到 ')' 预期错误。在 var productPrice= ''你能告诉我为什么要这样做吗?
【解决方案2】:

我更喜欢这里的 ajax 解决方案。作为 Microsoft 自己的 UpdatePanel 的替代方法,一个 javascript/ajax/json 调用将 Dropbox 中的选定值发送回服务器而无需重新加载。

【讨论】:

  • ya...我认为这又是最好的方法之一。
  • 什么?再打一个电话来做你已经有的事情?呐呐!!
【解决方案3】:

一般来说,在任何 Web 应用程序中解决此问题的一种直接方法是在页面中包含一个 [ProductId,ProductPrice] 数组,独立于下拉列表,并在客户端 JavaScript 中与您的 ' s 当前 ProductId 值。

【讨论】:

  • 您的意思是说我必须以数组形式在应用程序级别维护产品价格,以便我可以选择所选产品 ID 的价格?但是如果我添加新产品呢?
【解决方案4】:

您始终可以包含第二个下拉列表,其中包含 ProductID-Price 关系,并且隐藏使用 css。

就好像您有一个主子表关系,但有两个下拉列表。这只是一个使用 jQuery 等操作下拉列表的问题

【讨论】:

  • 我不这么认为,我必须维护另一个控件,这将使我的页面加权加载。在这种情况下,我认为性能将是问题。不是吗?
  • 它肯定不会让您的页面更轻,这是事实,但对于大多数可能的解决方案来说可能都是如此。归根结底,这将意味着在您的页面中保存一个额外的值列表... gol ol'Ajax 请求怎么样?
  • 坦率地告诉你这是错误的方法来修复目标。
猜你喜欢
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
相关资源
最近更新 更多