5

J'ai un requirment pour invoquer une méthode de contrôleur de la page de vue. Au clic du lien ci-dessous la méthode devrait être invoquée.Une nouvelle fenêtre s'ouvre sur le clic d'actionLink

@Html.ActionLink(item.InvoiceNumber, "SendPdfStatement", "Invoice", 
       new { item.InvoiceNumber }, new { target = "_blank" }) 

la signature de la méthode est que:

public void SendPdfStatement(string InvoiceNumber) 
    { 

     InvoiceNumber = InvoiceNumber.Trim(); 

     ObjectParameter[] parameters = new ObjectParameter[1]; 
     parameters[0] = new ObjectParameter("InvoiceNumber", InvoiceNumber); 

     List<Models.Statement> list = new List<Models.Statement>(); 
     list = _db.ExecuteFunction<Models.Statement>("uspInvoiceStatement", parameters).ToList<Models.Statement>(); 

     var statementResult = _db.ExecuteFunction<Models.Statement>("uspInvoiceStatement", parameters); 
     Models.Statement statement = statementResult.SingleOrDefault(); 

     pdfStatementController.WriteInTemplate(statement);         

    } 

maintenant le problème est quand je clique sur le lien, une fenêtre vide apparaît. Je sais que c'est quelque chose avec new { target = "_blank" }. Si je passe null à sa place ma page avec le lien devient vide. Que dois-je passer ici pour que ma page reste telle quelle et qu'aucune nouvelle fenêtre vide n'apparaisse également.

+0

Le problème est dans votre méthode de contrôleur, pas dans cette invocation d'aide html.Il semble que votre méthode retourne un résultat vide. Vous devriez nous montrer le code manquant. D'ailleurs, votre méthode devrait s'appeler 'SendPdfStatement', dans une classe' InvoiceController'. Êtes-vous sûr de vérifier le bon? –

+0

la méthode s'appelle SendPdfStatement uniquement dans InvoiceController. Ont mis le code de détail pour la méthode – 14578446

Répondre

2

Changer votre contrôleur d'action. La page que vous obtenez est vide parce que vous ne retournez rien. Faites

public ActionResult SendPdfStatement(string InvoiceNumber) 

    { 
    InvoiceNumber = InvoiceNumber.Trim(); 

     ObjectParameter[] parameters = new ObjectParameter[1]; 
     parameters[0] = new ObjectParameter("InvoiceNumber", InvoiceNumber); 

     List<Models.Statement> list = new List<Models.Statement>(); 
     list = _db.ExecuteFunction<Models.Statement>("uspInvoiceStatement", parameters).ToList<Models.Statement>(); 

     var statementResult = _db.ExecuteFunction<Models.Statement>("uspInvoiceStatement", parameters); 
     Models.Statement statement = statementResult.SingleOrDefault(); 

     pdfStatementController.WriteInTemplate(statement); 

    return View(); 
    } 

EDIT: Ou vous devez utiliser AJAX afin que votre page n'est pas rechargées et vous ne devez pas retourner quoi que ce soit de votre méthode. Lisez ici http://www.asp.net/mvc/overview/older-versions-1/contact-manager/iteration-7-add-ajax-functionality-cs.

+0

mais je n'ai rien à retourner ici – 14578446

+0

Vous le faites. Vous renvoyez une vue pour que quelque chose puisse être affiché sur la page. Vous pouvez faire 'return View ('pathhere');' –

+0

ma vue originale nécessite un modèle en entrée qui ne sera pas disponible ici à l'intérieur de "SendPdfStatement" – 14578446

0

essayer de passer _self au lieu _blank ou bien passer null au lieu de, new { target = "_blank" }

à savoir@Html.ActionLink(item.InvoiceNumber, "SendPdfStatement", "Invoice", new { item.InvoiceNumber }, null)

ou laisser hors new { target = "_blank" } tous ensemble

+0

passant _self ou null rend la fenêtre d'origine vide. Laisser {target = "_blank"} déclenche une exception car new {item.InvoiceNumber} est considéré comme le paramètre html. – 14578446

0

d'abord

TARGET = "_blank" 

est utilisé pour ouvrir des ressources hyperreferenced dans une nouvelle fenêtre du navigateur, donc si vous ne voulez pas la nouvelle fenêtre - pourquoi vous mettre cela en place? :-)

Deuxièmement, regardez la méthode d'aide ActionLink (la description que je pris de la question référencée ci-dessous):

  Html.ActionLink(article.Title, 
      "Item", // <-- ActionMethod 
      "Login", // <-- Controller Name. 
      new { article.ArticleID }, // <-- Route arguments. 
      null // <-- htmlArguments .. which are none. You need this value 
        //  otherwise you call the WRONG method ... 
        //  (refer to comments, below). 
      ) 

un coup d'oeil à HTML.ActionLink method

Je suppose que vous frappez la mauvaise méthode surcharge si vous obtenez des erreurs. Si vous remplacez htmlArguments par null, vous devriez être prêt à partir, mais comme votre méthode retourne VOID (rien), vous obtiendrez une page vide (quoi d'autre vous attendez :)?)

Pour annuler le mécanisme de navigation par défaut, vous pouvez mettre en œuvre la règle de jquery simple:

$('a.invoicelinkclass').click(function(e){ 
    e.preventDefault(); 
    $.get($(this).attr('href'),function(){ 
     // maybe an alert() or jquery ui .dialog() to let user know that something happened ? 
    }); 
}); 
+0

juste vouloir se débarrasser de la page blanche – 14578446

+0

d'ouverture, vous pouvez utiliser javascript (j'ai mis à jour ma réponse) mais il serait bon de faire savoir à l'utilisateur si son action a réussi ou non – torm

6

Essayez cette

<%=Html.ActionLink(a.Title, "View", "Report", new { Id = a.id.ToString() }, new { target="_blank" })%> 
0
@Html.ActionLink(item.InvoiceNumber, "SendPdfStatement", "Invoice", 
       new { item.InvoiceNumber }, null); 

Donc, fondamentalement, ce dernier paramètre est vos attributs HTML, si vous ne Il n'est pas nécessaire d'ouvrir dans une nouvelle fenêtre ... c'est le seul attribut qui existe, alors passez juste null pour tout le paramètre.

1
<input type="button" class="btn btn-primary" value="Text" onclick="window.open('@Url.Action("Action", "Controller")',target='_blank');return false;"/>   

<button type="button" class="goBtn btn btn-primary btn-mid" onclick="window.open('@Url.Action("CheckInReport", "Staff")', target='_blank')" id="CheckIn">Check In</button> 

Cela fonctionne pour MVC5 ainsi

Questions connexes