Базовая функциональность, которую я хочу реализовать, заключается в том, что содержимое таблицы обновляется при выборе элемента раскрывающегося списка. Это обновится, когда пользователь сделает новый выбор, получит новую информацию из базы данных и снова заполнит таблицу.
Стоит также отметить, что DropDownListFor, с которым я хочу работать .change (), не содержится в AjaxForm, но появляется в другом месте страницы (по общему признанию, в другой форме)
Чтобы достичь этого, я посмотрел на этот вопрос: Динамическое рендеринг частичного представления в ASP.Net MVC3 Razor с использованием Ajax-вызова Action , который хорошо выполняет часть пути, который я хочу сделать.
Пока у меня есть метод контроллера, который обрабатывает заполнение настраиваемой модели представления для частичного представления:
[HttpPost]
public ActionResult CompanyBillingBandDetails(int id = 0)
{
var viewModel = new BillingGroupDetailsViewModel();
var billingGroupBillingBands =
_model.GetAllRecordsWhere<BillingGroupBillingBand>(x => x.BillingGroupId == id).ToList();
foreach (var band in billingGroupBillingBands)
{
viewModel.BillingBands.Add(band.BillingBand);
}
return PartialView("BillingGroupDetailsPartial", viewModel);
}
ViewModel Я хочу заполнить каждый вызов:
public class BillingGroupDetailsViewModel
{
public List<BillingBand> BillingBands { get; set; }
}
Строго типизированная модель, которую я использую в качестве модели для частичного вида
public class BillingBandsObject
{
public int BillingBandId { get; set; }
public int RangeFrom { get; set; }
public int RangeTo { get; set; }
public Decimal Charge { get; set; }
public int BillingTypeId { get; set; }
public bool Delete { get; set; }
}
Частичное представление, которое оно заполняет и возвращает:
@model xxx.xxx.DTO.Objects.BillingBandsObject
<tr>
<td>
@Html.DisplayTextFor(x => x.RangeFrom)
</td>
</tr>
<tr>
<td>
@Html.DisplayTextFor(x => x.RangeTo)
</td>
</tr>
<tr>
<td>
@Html.DisplayTextFor(x => x.Charge)
</td>
</tr>
Код Razor для этого раздела страницы:
<table>
<thead>
<tr>
<th>
Range From
</th>
<th>
Range To
</th>
<th>
Charge
</th>
</tr>
</thead>
<tbody>
@using (Ajax.BeginForm("CompanyBillingBandDetails", new AjaxOptions() { UpdateTargetId = "details", id = "ajaxform" }))
{
<div id="details">
@Html.Action("CompanyBillingBandDetails", new { id = 1 })
</div>
}
</tbody>
</table>
и, наконец, функция, которую я поднял почти прямо из ответа Дарина:
$(function () {
$('#billinggrouplist').change(function () {
// This event will be triggered when the dropdown list selection changes
// We start by fetching the form element. Note that if you have
// multiple forms on the page it would be better to provide it
// an unique id in the Ajax.BeginForm helper and then use id selector:
var form = $('#ajaxform');
// finally we send the AJAX request:
$.ajax({
url: form.attr('action'),
type: form.attr('method'),
data: form.serialize(),
success: function (result) {
// The AJAX request succeeded and the result variable
// will contain the partial HTML returned by the action
// we inject it into the div:
$('#details').html(result);
}
});
});
});
На данный момент я преодолел ряд ошибок, в настоящее время я сталкиваюсь с:
"Ошибка при выполнении дочернего запроса для обработчика" System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper '. "
Однако я чувствую, что мое понимание проблемы в целом может быть недостаточным.
Любая помощь приветствуется!