.net中是否存在从字符串创建安全Control.ID
属性以满足以下条件(来自MSDN)的任何内容:
只有字母数字字符和下划线字符(_)的组合才是此属性的有效值。包含空格或其他无效字符将导致ASP.NET页面解析器错误。
我可以拿一个字符串作为例子:
Hello world
得到类似的东西:
hello_world
我知道我可以写一些习惯来做这件事,但似乎他们应该已经存在这样做了,到目前为止我还没有找到任何东西。
答案 0 :(得分:0)
好吧,如果你愿意写一些自定义的东西,我认为这是最好的,它非常简单。
public static void Main(string[] args)
{
var s = "some user input";
Regex r = new Regex(@"\W|_");
var x = r.Replace(s, "_");
Console.WriteLine(x);
Console.WriteLine(r.Replace("http://google.com?s=search query here", "_"));
}
some_user_input
HTTP ___ google_com_s_search_query_here
答案 1 :(得分:0)
如果您不需要将生成的控件名称转换回原始字符串,则可以使用字符串的哈希码而不是字符串的文本:
public string GetControlName(string userInput)
{
var hashCode = userInput.GetHashCode();
string controlName;
if (hashCode < 0)
{
controlName = String.Concat("uc_", -hashCode);
}
else
{
controlName = String.Concat("uc", hashCode);
}
return controlName;
}
这会给你:
Hello world
<强> uc_1660742776 强>
一些用户输入
<强> uc_1363708559 强>
http://google.com?s=search在此查询
<强> uc_2146180550 强>
另一种可能的方法是使用SHA算法之一(SHA1,SHA256,...):
public string GetSHAControlName(string userInput)
{
using (var sha = SHA1.Create())
{
var input = Encoding.Default.GetBytes(userInput);
var hash = sha.ComputeHash(input);
return string.Concat("uc", GetStringFromHash(hash));
}
}
public static string GetStringFromHash(byte[] hash)
{
StringBuilder result = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
result.Append(hash[i].ToString("X2"));
}
return result.ToString();
}
这给了你:
Hello world
<强> uc7B502C3A1F48C8609AE212CDFB639DEE39673F5E 强>
一些用户输入
<强> uc2503971E0748D1CCBFB2022D3332ACF903EB4B8F 强>
http://google.com?s=search在此查询
<强> ucBBD010B90C6804F25E1B0AF2C1464278AB9BC08C 强>