Necesito para obtener la matriz de cadena o de la lista con ajax y de la Acción, este es mi Aplicación:

Este es mi Dom de html de la vista de Índice de acción en 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>

Mi Controlador:

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);

   }
  }
}

y la secuencia de comandos:

$(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');

}

Y el problema es con todos los cambios de la lista desplegable sólo Onfail la función de ejecutar y alerta de mí «en OnFailRoleChangeHandler», también puedo comprobar la RoleDropDownChanged Acción con el punto de ruptura y que nunca se ejecutan, donde está el problema?

ACTUALIZACIÓN

cuando se carga la página de chrome hay un error en la ventana de la consola:
http://MyProject/GlobalAccess/AccessMenu/@Url.Action(%22RoleDropDownChanged%22) 404 (Not Found) jquery-1.7.1.js:8102

  • Cuando se depura, ¿su método de servidor lanza la excepción? ¿Has probado la depuración de código javascript?
  • si usted tiene este @Url.Action(%22RoleDropDownChanged%22) que su guión no es analizado por la maquinilla de Afeitar del Motor. Si usted puede, usted puede poner el script dentro de una maquinilla de afeitar de la vista y no en un seperate .js-archivo.
  • Puedo actualizar a la Pregunta
  • Si la secuencia de comandos reside en un .archivo js, entonces esto no va a funcionar. Donde está el script declarado?
InformationsquelleAutor Saeid | 2012-03-29

3 Comentarios

  1. 6

    Quitar esta configuración:

    contentType: 'application/json; charset=utf-8',

    No enviar cualquier JSON para el servidor.

    Si quieres mantener esta configuración, a continuación, asegúrese de que usted está enviando un JSON válido para el servidor:

    data: JSON.stringify({ 'roleId': '61AD3FD9-C080-4BB1-8012-2A25309B0AAF' })

    Así:

    $.ajax({
        url: '@Url.Action("RoleDropDownChanged")',
        type: 'POST',
        data: { 'roleId': '61AD3FD9-C080-4BB1-8012-2A25309B0AAF' },
        success: SuccessRoleChangeHandler,
        error: OnFailRoleChangeHandler
    });

    debería funcionar (por lo menos no para mí), con las siguientes medidas:

    [HttpPost]
    public ActionResult RoleDropDownChanged(Guid roleId) 
    {
        var actions = Enumerable.Range(1, 10).Select(x => x.ToString()).ToList();
        return Json(actions);
    }

    ACTUALIZACIÓN:

    De acuerdo a sus comentarios, parece que estás tratando de usar el lado del servidor ayudantes por separado, en un javascript que no es posible. He aquí lo que yo sugeriría usted. Comenzar por proporcionar la url a la hora de generar el desplegable:

    <div class="RoleAccess">
        @Html.DropDownListFor(
            x => x.RoleDropDown, 
            Model.Roles, 
            "-- Select role --",
            new { 
                data_url = Url.Action("RoleDropDownChanged") 
            }
       )
    </div>

    y, a continuación, en el archivo javascript independiente:

    $(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');
                }
            });        
        });    
    });

    y luego, por supuesto, usted puede reemplazar la codificado roleId con el valor seleccionado actualmente:

    data: { 'roleId': $(this).val() }
    • Yo trate tanto de sus sugerencias, hay un mismo problema.
    • Pruebe a quitar processData: false así. También ves algún error en su depurador de javascript? ¿Qué es exactamente la respuesta del servidor a la petición AJAX?
    • Yo lo hago, no funcionó, el mismo problema.
    • Lo siento, soy incapaz de reproducir el problema. He probado el código que me mostró y funcionó bien para mí. Lo que hace el servidor responde a la petición AJAX? Mira a tu js herramienta de depuración.
    • Gracias por responder, cuando me carga la página de chrome hay un error en la ventana de la consola: http://MyProject/GlobalAccess/AccessMenu/@Url.Action(%22RoleDropDownChanged%22) 404 (Not Found)
    • Oh, ¿estás tratando de usar el lado del servidor ayudantes como @Url.Action separado en un archivo javascript? Que no va a funcionar. Se ha de definir la url dentro de la plantilla para que usted tenga acceso a la dirección url de ayudantes y, a continuación, podría utilizar la variable en el archivo javascript independiente.
    • Como usted dijo, sí, yo lo uso en un archivo javascript separado, pero yo no podía entender cómo definir la url dentro de la Vista y cómo utilizarlo en el script?
    • He actualizado mi respuesta para ilustrar cómo podría lograrlo.

  2. 2

    Mover su $(document).ready función de su punto de Vista como este:

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

    A continuación, en el archivo JS agregar el parámetro de dirección url para su función y cambio de llamada de 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;
    }

    Esto debería funcionar como se esperaba.

    • Gracias, esto funcionó para mí.
  3. 1

    Si la secuencia de comandos reside en un .Archivo JS, entonces esto no va a funcionar, ya que va a ser tratados como texto sin formato. Puede mover toda la secuencia de comandos a la vista o puede re-factor de secuencia de comandos para que la mayoría de la secuencia de comandos permanece en el .JS y, a continuación, pase valores relevantes desde el punto de vista.

Dejar respuesta

Please enter your comment!
Please enter your name here