Удалите этот параметр:
contentType: 'application/json; charset=utf-8',
Вы не отправляете JSON на сервер.
Если вы хотите сохранить этот параметр, убедитесь, что вы отправляете действительный JSON наваш сервер:
data: JSON.stringify({ 'roleId': '61AD3FD9-C080-4BB1-8012-2A25309B0AAF' })
Итак:
$.ajax({
url: '@Url.Action("RoleDropDownChanged")',
type: 'POST',
data: { 'roleId': '61AD3FD9-C080-4BB1-8012-2A25309B0AAF' },
success: SuccessRoleChangeHandler,
error: OnFailRoleChangeHandler
});
должен работать (по крайней мере, для меня) со следующим действием:
[HttpPost]
public ActionResult RoleDropDownChanged(Guid roleId)
{
var actions = Enumerable.Range(1, 10).Select(x => x.ToString()).ToList();
return Json(actions);
}
ОБНОВЛЕНИЕ:
Судя по вашим комментариям, похоже, что вы пытаетесь использовать серверные помощники в отдельном javascript, что невозможно.Вот что я бы тебе посоветовал.Начните с предоставления URL-адреса при создании раскрывающегося списка:
<div class="RoleAccess">
@Html.DropDownListFor(
x => x.RoleDropDown,
Model.Roles,
"-- Select role --",
new {
data_url = Url.Action("RoleDropDownChanged")
}
)
</div>
, а затем в отдельном файле javascript:
$(document).ready(function() {
$('div.RoleAccess select').change(function () {
var url = $(this).data('url');
$.ajax({
url: url,
type: 'POST',
data: { 'roleId': '61AD3FD9-C080-4BB1-8012-2A25309B0AAF' },
success: function(result) {
alert('success');
},
error: function() {
alert('error');
}
});
});
});
, и затем, конечно, вы можете заменить жестко закодированный roleId выбранным в данный моментзначение:
data: { 'roleId': $(this).val() }