2013-03-18 9 views
11

Sto utilizzando ajax per caricare una vista parziale per aggiungere/modificare una riga in una griglia di kendo. Quando premo un pulsante di modifica nella riga, voglio anche non consentire all'utente di chiamare direttamente l'azione Home/AddModify dal browser.Utilizzo dell'attributo MVC3 childactiononly con ajax

Se metto [ChildActionOnly] alla mia azione "AddModify" che non mi permette di caricare la vista parziale perché tutto è nella chiamata ajax, e io non voglio avere nella vista da qualche parte come un @Html.Action("Home/AddModify",model). Inoltre, non voglio caricarlo dall'inizio quando la pagina viene caricata.

Posso chiamare la vista parziale in modo che venga visualizzata solo su richiesta (in modo dinamico)?

risposta

19

Quello che vi serve è un AJAX solo attribte Date un'occhiata a this question

Dichiarare piace

public class AjaxOnlyAttribute : ActionMethodSelectorAttribute 
    { 
     public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo) 
     { 
      return controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest(); 
     } 
    } 

e usarlo come

[AjaxOnly] 
public ActionResult ajaxMethod() 
{ 

} 
+0

sì, è ok questo si too.thank per la vostra risposta. –

+0

@kingjulian se questa risposta ti aiuta, sentiti libero di contrassegnarlo come accettato. –

3

È possibile utilizzare il metodo IsAjaxRequest estensione HttpRequestBase.

Non impedisce a tutti gli utenti di chiamarlo (non è possibile impedirli finché non è pubblicamente accessibile) (perché possono modificare le intestazioni per qualsiasi cosa), ma per scopi generali può essere un bene per te.

È possibile effettuare un'ActionFilter:

public class RestrictToAjaxAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      throw new InvalidOperationException("This action is only available via ajax"); 
     } 
    } 
} 

e mettere questo attributo in cima alla vostra azione:

[RestrictToAjax] 
public ActionResult YourAction() 
{ 
} 
+0

ne ero a conoscenza nel tutorial di pluralight su mvc 4, e non ci ho pensato. Mi basta usare IsAJaxRequest, inserire un messaggio o una pagina di errore quando non è ajax ok. Molte grazie per l'ideea . –

+0

prego! –

+0

se voglio restituire una pagina html invece di lanciare un errore, come posso farlo? –