When you look at the output html you would get something like this :
<form action="/persons/index?sort=asc" method="get">
<p>
<input type="text" name="search" />
<input type="submit" value="Search" />
</p>
</form>
This seems completely legit, you would expect a behaviour like appending the query of post inputs. However this is limited by HTTP specification. The query string of a form post action wont be appended. That is why your query parameters wont work at your server side. However i what would expect from the Asp.net to get the parameters for the form to the hidden fields automatically which it doesnt right now.
As a proper solution you have to put the input , in the form , so you can use hidden field to do this like :
@using (Html.BeginForm("Index", "Persons", FormMethod.Get))
{
@Html.Hidden("sort",ViewBag.Sort)
<p>
Search: @Html.TextBox("search", ViewBag.Search as string)
<input type="submit" value="Search" />
</p>
}