ASP.NET Core Razor Pages中字符串转整数实现用户ID匹配问题
解决ASP.NET Core Razor Pages中用户名与VendorId的匹配问题
针对你遇到的用户名(如V003950,字符串类型)与VendorId(如3950,整数类型)无法匹配的问题,提供两种严谨的解决方案:
方法一:提取用户名数字部分转整数匹配
从用户名中去掉开头的V,通过安全转换将剩余部分转为整数后,与VendorId直接比较。这种方式能避免因用户名格式异常导致的运行错误:
@foreach (var item in Model.Files) { // 提取用户名中的数字并安全转换为整数 if (int.TryParse(User.Identity?.Name?.TrimStart('V'), out int userId) && userId == item.VendorId) { if (item.FileType == "Purchase Order") { <tr> <td> @Html.DisplayFor(modelItem => item.Number) </td> <td> @if (item.Attachment != null) { <form asp-page-handler="Download" method="post" asp-route-id="@item.Id"> <input type="submit" class="btn btn-dark" value="Download"> </form> } </td> </tr> } } }
TrimStart('V')会移除用户名开头的所有V字符,int.TryParse确保转换失败时不会抛出异常,同时只有转换成功且数值匹配时才会执行后续逻辑。
方法二:格式化VendorId为字符串匹配(适配固定长度数字)
如果用户名的数字部分是固定长度(如V003950对应6位数字),可以将VendorId格式化为带前导零的字符串,再与去掉V的用户名做精确匹配:
@foreach (var item in Model.Files) { var usernameWithoutV = User.Identity?.Name?.TrimStart('V'); // 将VendorId格式化为6位带前导零的字符串(根据实际长度调整D后的数字) var vendorIdFormatted = item.VendorId.ToString("D6"); if (usernameWithoutV == vendorIdFormatted && item.FileType == "Purchase Order") { <tr> <td> @Html.DisplayFor(modelItem => item.Number) </td> <td> @if (item.Attachment != null) { <form asp-page-handler="Download" method="post" asp-route-id="@item.Id"> <input type="submit" class="btn btn-dark" value="Download"> </form> } </td> </tr> } }
这种方式适用于用户名数字部分长度固定的场景,能确保完全匹配,避免部分字符匹配导致的错误。
不推荐使用Contains方法的原因
直接使用User.Identity?.Name?.Contains(item.VendorId.ToString())存在逻辑漏洞:例如VendorId=395时,会错误匹配用户名V003950,因为字符串包含395,但实际两者并不对应。因此这种方式不够严谨,不建议采用。
内容的提问来源于stack exchange,提问作者Megan Paterson
相关产品推荐
相关产品推荐

