2013-01-09 23 views
5

Vorrei passare una variabile javascript in un metodo @ Url.Action come parametro di route.Passa la variabile Javascript al valore di instradamento in MVC3

Mi piace passare la variabile javascript screenmode come parametro di percorso al metodo di azione.

Ho un modello di visualizzazione con proprietà enum ScreenMode e in base a questo i deve chiamare un'azione in Ajax. Devo anche passare una variabile javascript come parametro per il percorso.

Questo è quello che ho provato e ottenuto errore di compilazione.

Il nome 'ScreenMode' non esiste nel contesto attuale

$("#role-detail-form").submit(function (e) { 

    if ($(this).valid()) { 
    var screenMode = 0; 
    @{ 
    if (Model.ScreenMode == UI.ViewModel.ScreenMode.New) 
    { 
     <text> 
     screenMode =2; 
     </text> 
    } 
    } 
    $.post('@Url.Action("SaveRoleDetail", new { mode=screenMode})', 
      $(this).serialize(), function (data) { 
       $("#role-detail").html(data); 
       $.validator.unobtrusive.parse($("#role-detail")); 
      }); 
     } 
     e.preventDefault(); 
    }); 

La mia azione è

public ActionResult SaveRoleDetail(RoleModel viewModel, ScreenMode screenMode) 
    { 
    } 

risposta

6

che avrebbe dovuto dividere che fuori e costruire la stringa di query da soli, per incorporare la variabile Javascript.

Qualcosa di simile a questo è quello che vi serve:

$.post('@(Url.Action("SaveRoleDetail"))?screenMode=' + screenMode) 

EDIT: Anche se probabilmente le migliori pratiche, è necessario memorizzare la variabile ScreenMode nel vostro modello, poi mettere un HiddenFor nella vista per esso. Quindi, ogni volta che si modifica il valore in Javascript, è sufficiente aggiornare il valore dell'ingresso nascosto, in questo modo il metodo di azione deve solo prendere il modello di vista come parametro. Se stai pubblicando il modulo in JavaScript, puoi chiamare lo $("#form").serialize() per inviare tutti i dati nella tua chiamata successiva.

+0

Posso passare questa stringa di query nel metodo post ajax? come sarà l'url? screenMode farà parte dei parametri del post o nella stringa di query? –

+0

Ancora meglio, potresti inserire lo ScreenMode nel tuo modello, avere un hiddenFor nella vista, quindi se vuoi cambiare il suo valore in Javascript, puoi semplicemente aggiornare il valore dell'ingresso nascosto, poi quando tutto è fatto, basta fare $ ("# form"). serialize() ;, in questo modo il metodo di azione deve solo prendere il modello di visualizzazione come parametro :) – mattytommo

+0

Sì, sei corretto. Ora utilizzo il campo nascosto e aggiorno con Javascript. Puoi aggiungere queste informazioni sul campo nascosto come parte della tua risposta. Quindi sarà facilmente visibile e utile anche per gli altri :) –

0

Se si utilizza T4MVC e jQuery, è possibile chiamare l'ActionResult nel seguente modo:

Nel controllore:

public ActionResult SaveRoleDetail(RoleModel viewModel, ScreenMode screenMode) 
{ 
} 

Nella vista:

$.post("@Url.Action(MVC.Home.SaveRoleDetail())", { viewModel: param1, screenMode: param2) }, function (data) { 

     //Do Work 

    }); 
+1

Sarà utile se si aggiunge un collegamento per T4MVC e jQuery. Quindi le persone possono facilmente navigare da qui. Grazie –

+0

Mi dispiace, ho perso i collegamenti. Entrambi sono disponibili come pacchetti Nuget. T4MVc può essere trovato qui (http: // t4mvc.codeplex.com/) e jQuery qui (http://jquery.com/) Spero che questo aiuti. – lopezbertoni

4

Inoltre è possibile creare un segnaposto e quindi sostituirlo:

var url = '@Url.Action("GetOrderDetails", "Home", new { id = "js-id" })' 
      .replace("js-id", encodeURIComponent(rowId)); 
+0

Preferisco questo approccio – Alireza

Problemi correlati