Используйте Ajax и JsonResult в ASP.NET MVC 3 - PullRequest
4 голосов
/ 29 марта 2012

Мне нужно получить строковый массив или список с помощью ajax и Action, это моя реализация:

Это мой HTML-код представления действия Index в AccessMenuController:

<div class="RoleAccess">
   <select name="RoleDropDown">
    <option value="0">Select Role</option>
    <option value="61AD3FD9-C080-4BB1-8012-2A25309B0AAF">AdminRole</option>
    <option value="8A330699-57E1-4FDB-8C8E-99FFDE299AC5">Role2</option>
    <option value="004E39C2-4FFC-4353-A06E-30AC887619EF">Role3</option>
   </select>
</div>

Мой контроллер:

namespace MyProject.Areas.GlobalAccess.Controllers {

public class AccessMenuController : Controller {

    public ActionResult Index() { return View();}

    [HttpPost]
    public JsonResult RoleDropDownChanged(string roleId) {

     Guid RoleId = new Guid(roleId);

    //Some implement

    List<string> actions = new List<string>();
    for(int i = 0; i <= 10; i++) 
            actions.Add(i.ToString());

return Json(actions.ToArray(), JsonRequestBehavior.AllowGet);

   }
  }
}

и сценарий:

$(document).ready(function () {

//Handle Checks of Actions by RoleName Changed
$('div.RoleAccess select').change(function () {
    RoleChangeHandler();
});

function RoleChangeHandler() {

    $.ajax({
        url: '@Url.Action("RoleDropDownChanged")',
        type: 'POST',
        data: { 'roleId': '61AD3FD9-C080-4BB1-8012-2A25309B0AAF' },
        dataType: 'json',
        processData: false,
        contentType: 'application/json; charset=utf-8',
        success: function (data) { SuccessRoleChangeHandler(data); },
        error: OnFailRoleChangeHandler
    });
    return false;
}


function SuccessRoleChangeHandler(data) {

    alert("in success role change");

}

function OnFailRoleChangeHandler(result) {
    alert('in OnFailRoleChangeHandler');

}

И проблема со всеми изменениями выпадающего меню: Onfail функция запускается и выдает мне предупреждение "в OnFailRoleChangeHandler", также я проверяю действие RoleDropDownChanged с точкой останова, которая никогда не запускается, в чем проблема?

UPDATE

при загрузке страницы по хрому в окне консоли появляется ошибка: http://MyProject/GlobalAccess/AccessMenu/@Url.Action(%22RoleDropDownChanged%22) 404 (Not Found) jquery-1.7.1.js:8102

Ответы [ 3 ]

6 голосов
/ 29 марта 2012

Удалите этот параметр:

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() }
2 голосов
/ 29 марта 2012

Переместите свою функцию $(document).ready в свой вид следующим образом:

<script type="text/javascript">
$(document).ready(function () {

    //Handle Checks of Actions by RoleName Changed
    $('div.RoleAccess select').change(function () {
        RoleChangeHandler('@Url.Action("RoleDropDownChanged")');
   });
});
</script>

Затем в свой JS-файл добавьте параметр url в свою функцию и измените вызов ajax:

function RoleChangeHandler(pageUrl) {

    $.ajax({
        url: pageUrl,
        type: 'POST',
        data: { 'roleId': '61AD3FD9-C080-4BB1-8012-2A25309B0AAF' },
        dataType: 'json',
        processData: false,
        contentType: 'application/json; charset=utf-8',
        success: function (data) { SuccessRoleChangeHandler(data); },
        error: OnFailRoleChangeHandler
    });
    return false;
}

Thisдолжно работать так, как вы ожидали.

1 голос
/ 29 марта 2012

Если ваш скрипт находится в .JS-файле, это не сработает, так как он будет обрабатываться как обычный текст.Вы можете либо переместить весь сценарий в представление, либо перефакторизовать сценарий, чтобы большая часть сценария осталась в .JS, а затем вы передали соответствующие значения из представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...