传递int数组作为参数在web用户控制(Passing int array as parameter

2019-06-26 13:21发布

我有一个int数组的Web用户控件的属性。 我想如果可能的话使用下面的语法来设置该属性,内联:

<uc1:mycontrol runat="server" myintarray="1,2,3" />

这将在运行时失败,因为它会在期待实际int数组,而是一个字符串被改为通过。 我可以myintarray字符串,并以二传手解析它,但我想知道是否有一个更好的解决方案。

Answer 1:

实现一个类型转换器,这里是一个警告:快速和肮脏的,而不是用于生产,等等:

public class IntArrayConverter : System.ComponentModel.TypeConverter
{
    public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string);
    }
    public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        string val = value as string;
        string[] vals = val.Split(',');
        System.Collections.Generic.List<int> ints = new System.Collections.Generic.List<int>();
        foreach (string s in vals)
            ints.Add(Convert.ToInt32(s));
        return ints.ToArray();
    }
}

和标记您的控件的属性:

private int[] ints;
[TypeConverter(typeof(IntsConverter))]
public int[] Ints
{
    get { return this.ints; }
    set { this.ints = value; }
}


Answer 2:

@mathieu,非常感谢您的代码。 我修改它有点为了编译:

public class IntArrayConverter : System.ComponentModel.TypeConverter
{
    public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string);
    }
    public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        string val = value as string;
        string[] vals = val.Split(',');
        System.Collections.Generic.List<int> ints = new System.Collections.Generic.List<int>();
        foreach (string s in vals)
            ints.Add(Convert.ToInt32(s));
        return ints.ToArray();
    }
}


Answer 3:

在我看来,逻辑和更具扩展性的方法是从取页面asp:列表控件:

<uc1:mycontrol runat="server">
    <uc1:myintparam>1</uc1:myintparam>
    <uc1:myintparam>2</uc1:myintparam>
    <uc1:myintparam>3</uc1:myintparam>
</uc1:mycontrol>


Answer 4:

大段@mathieu。 我需要使用这个转换多头,但不是制造LongArrayConverter,我写了一个使用泛型版本。

public class ArrayConverter<T> : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        string val = value as string;
        if (string.IsNullOrEmpty(val))
            return new T[0];

        string[] vals = val.Split(',');
        List<T> items = new List<T>();
        Type type = typeof(T);
        foreach (string s in vals)
        {
            T item = (T)Convert.ChangeType(s, type);
            items.Add(item);
        }
        return items.ToArray();
    }
}

这个版本应该可以与任何类型,它是从字符串转换工作。

[TypeConverter(typeof(ArrayConverter<int>))]
public int[] Ints { get; set; }

[TypeConverter(typeof(ArrayConverter<long>))]
public long[] Longs { get; set; }

[TypeConverter(typeof(ArrayConverter<DateTime))]
public DateTime[] DateTimes { get; set; }


Answer 5:

您是否尝试过寻找到的类型转换器? 这个页面看起来值得一看: http://www.codeguru.com/columns/VB/article.php/c6529/

此外,Spring.Net似乎有StringArrayConverter( http://www.springframework.net/doc-latest/reference/html/objects-misc.html -第6.4节),如果你可以将其提供给ASP.net装饰用的TypeConverter属性的属性,可能工作..



Answer 6:

你也可以做这样的事情:

namespace InternalArray
{
    /// <summary>
    /// Item for setting value specifically
    /// </summary>

    public class ArrayItem
    {
        public int Value { get; set; }
    }

    public class CustomUserControl : UserControl
    {

        private List<int> Ints {get {return this.ItemsToList();}
        /// <summary>
        /// set our values explicitly
        /// </summary>
        [PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(List<ArrayItem>))]
        public List<ArrayItem> Values { get; set; }

        /// <summary>
        /// Converts our ArrayItem into a List<int> 
        /// </summary>
        /// <returns></returns>
        private List<int> ItemsToList()
        {
            return (from q in this.Values
                    select q.Value).ToList<int>();
        }
    }
}

这将导致:

<xx:CustomUserControl  runat="server">
  <Values>
            <xx:ArrayItem Value="1" />
  </Values>
</xx:CustomUserControl>


Answer 7:

要添加子元素,让您的列表中,您需要在您的控制设置以某种方式:

[ParseChildren(true, "Actions")]
[PersistChildren(false)]
[ToolboxData("<{0}:PageActionManager runat=\"server\" ></PageActionManager>")]
[NonVisualControl]
public class PageActionManager : Control
{

上述操作是cProperty以下名称的子元素将是我用一个ArrayList,因为我没有测试别的吧:

        private ArrayList _actions = new ArrayList();
    public ArrayList Actions
    {
        get
        {
            return _actions;
        }
    }

当你contorl初始化以后有子元素的值。 这些你就可以说只是持有整数迷你类。



Answer 8:

不要做什么比尔在谈论的列表中,您只需要创建您的用户控件的列表属性。 然后比尔描述可以实现它。



Answer 9:

您可以添加到ASPX像这里面的页面事件:

<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
    YourUserControlID.myintarray = new Int32[] { 1, 2, 3 };
}
</script>


Answer 10:

您可以实现int数组和字符串数据类型之间转换类型转换器类。 然后装饰与TypeConverterAttribute你的int数组属性,指定是可以实现的类。 然后Visual Studio将使用类型转换的类型转换器在你的财产。



文章来源: Passing int array as parameter in web user control