ASP.NET视图中字符串方法赋值失效,ActionLink中却正常的问题
问题分析:字符串不可变性导致的赋值问题
这背后的核心原因是C#中的字符串是不可变类型——也就是说,一旦创建了一个字符串对象,你就无法修改它的内容。那些Trim、Replace、Substring方法看起来像是在修改原字符串,但实际上它们都会返回一个全新的字符串对象,而原字符串完全不会被改变。
为什么你的变量赋值不生效?
看你这段测试代码:
string str = "std"; str.Trim('d'); str.Substring(1); str.Replace('d', 'q'); @str; // str == "std"
你调用了这些方法,但没有把它们的返回值重新赋值给str。原字符串"std"一直没有变化,你只是调用方法生成了新字符串,但没有让str指向这个新对象。正确的写法应该是把返回值赋值回去:
string str = "std"; str = str.Trim('d'); // 现在str变成"st" str = str.Substring(1); // 变成"t" str = str.Replace('d', 'q'); // 还是"t"(因为没有d) @str; // 现在输出"t"
放到你的盘符处理场景里,你需要把方法的返回值赋值给myString,比如:
// 方法1:Trim掉冒号 string myString = Model.Content_array[i,0].Trim(':'); // 方法2:直接取第一个字符(更可靠,因为盘符一定是第一个字符) string myString = Model.Content_array[i,0].Substring(0, 1);
为什么在Html.ActionLink里直接用就有效?
当你在ActionLink里写:
@Html.ActionLink((string)Model.Content_array[i, j], "Index", new { id = Model.Content_array[i, 0].Substring(0, Model.Content_array[i, 0].Length -2) })
这里你直接把Substring方法返回的新字符串作为id参数的值传递给了方法,相当于直接使用了那个新生成的字符串对象,而不需要修改原变量,所以自然能正常工作。
额外小建议
针对你的盘符处理场景,直接取第一个字符是最稳妥的方式——不管原字符串是"C:\"还是"D:\",Substring(0,1)都能准确拿到盘符字母,比Trim或者截取固定长度更可靠。
内容的提问来源于stack exchange,提问作者Евгений Балаков
相关产品推荐
相关产品推荐

