Стоит отметить, что хотя System.Web.VirtualPathUtility.ToAbsolute очень полезен, он не идеальная замена для Control.ResolveUrl.
Существует по крайней мере одно существенное отличие: Control.ResolveUrl очень хорошо обрабатывает строки запросов, но они заставляют VirtualPathUtility генерировать исключение HttpException. Это может быть совершенно загадочным в первый раз, когда это происходит, особенно если вы привыкли к тому, как работает Control.ResolveUrl.
Если вы знаете точную структуру строки запроса, которую хотите использовать, это достаточно просто обойти, а именно:
public static string GetUrl(int id)
{
string path = VirtualPathUtility.ToAbsolute("~/SomePage.aspx");
return string.Format("{0}?id={1}", path, id);
}
... но если строка запроса передается из неизвестного источника, вам нужно как-то разобрать ее. (Прежде чем углубиться в это, обратите внимание, что System.Uri может сделать это за вас).