Я считаю, что ваша проблема с BeginForm заключается в том, что MVC всегда выполняет постбэк на всю страницу - по крайней мере, по моему опыту. Если вы хотите «частичную» обратную передачу, вам нужно использовать javascript и веб-сервисы.
Я делаю именно это, используя GeoIP. Вот как выглядит моя страница:
<p>
<label for="country">Country</label>
<%= Html.DropDownList("country", new SelectList(Model.Countries, "CountryId", "Name", Model.DefaultCountry.CountryId))%>
<%= Html.ValidationMessage("country")%>
</p>
<p>
<label for="subdivision">Subregion</label>
<%= Html.DropDownList("subdivision", new SelectList(Model.Subdivisions, "SubdivisionId", "Name", Model.DefaultSubdivision.SubdivisionId)) %>
<%= Html.ValidationMessage("subdivision")%>
</p>
<script type="text/javascript">
$('#country').change(function() {
$('#subdivision').children().remove();
var countryId = $("#country > option:selected").val();
Sys.Net.WebServiceProxy.invoke
(
'/WebServices/Regions.asmx',
"GetSubdivisions",
false,
{ countryId: countryId },
addressControl_bindOptionResults
);
});
function addressControl_bindOptionResults(data)
{
for (var x = 0; x < data.length; x++) {
$("#subdivision").append($('<option></option>').val(data[x].Id).html(data[x].Name));
}
}
</script>
Мой веб-сервис выглядит следующим образом. При добавлении нового веб-сервиса обязательно раскомментируйте атрибут над объявлением класса:
[System.Web.Script.Services.ScriptService]
Имейте в виду, ваш возвращаемый объект должен быть сериализуемым.
[WebMethod]
public Subdivision[] GetSubdivisions(int countryId)
{
if (this.repository == null)
{
Resolve();
}
List<Subdivision> subdivisions = new List<Subdivision>(repository.GetActiveSubdivisionsDto(countryId));
return subdivisions.ToArray();
}
Не обращайте внимания на некоторые внутренние аспекты работы моего веб-сервиса. Я использую Unity, Nfluent и NHibernate для своего уровня данных, но основы те же. Вызовите базу данных, верните свои объекты и верните список сериализуемых объектов передачи данных (у меня это просто имя и идентификатор).