5

我有一个从视图页面调用控制器方法的需求。点击下面的链接应该调用该方法。点击动作链接打开新窗口链接

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

方法签名是:

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

    } 

现在的问题是,当我点击链接,打开一个空白窗口。我知道这是new { target = "_blank" }。如果我通过null它的地方,我的页面链接变成空白。我应该通过什么方式让我的页面保持原样,并且不会出现新的空白窗口。

+0

的问题是在你的控制器的方法,而不是在这个网站助手调用。看来你的方法正在返回一个空的结果。您应该向我们显示缺少的代码。顺便说一下,您的方法应该在'InvoiceController'类中被称为'SendPdfStatement'。你确定你在检查正确的吗? –

+0

该方法仅在InvoiceController中被称为SendPdfStatement。已经把方法 – 14578446

回答

2

改变你的控制器动作。你得到的页面是空白的,因为你没有返回任何东西。做

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

编辑: 或者你应该使用AJAX让你的网页没有重新加载,你不必从你的方法返回任何东西。在这里阅读http://www.asp.net/mvc/overview/older-versions-1/contact-manager/iteration-7-add-ajax-functionality-cs

+0

但我没有任何东西回到这里 – 14578446

+0

你这样做。您正在返回视图,以便可以在页面上显示某些内容。你可以做'返回视图('pathhere');' –

+0

我的原始视图需要一个模型作为输入,这里将不会提供“SendPdfStatement”里面的内容 – 14578446

0

尝试传球_self代替_blank或可选择地通过null代替,new { target = "_blank" }

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

或离开关闭new { target = "_blank" }一起

+0

的详细代码通过_self或null使原始窗口变为空白。由于将{item.InvoiceNumber}作为html参数,所以留下{target =“_blank”}引发异常。 – 14578446

0

的所有

TARGET = "_blank" 

首先是用在一个新的浏览器窗口中打开hyperreferenced资源,所以如果你不希望新的窗口 - 你为什么还要把在地方? :-)

其次,看ActionLink的辅助方法,(说明我的问题波纹管中引用了):

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

看看HTML.ActionLink method

我假设你击中了错误的方法过载如果你得到错误。如果你用null替换htmlArguments,你应该很好去,但是当你的方法返回VOID(没有)时,你会得到一个空白页面(你还期望什么:)? )

要取消默认的导航机制,可以实现简单的jQuery规则:

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

只是想摆脱空白页开头 – 14578446

+0

你可以使用JavaScript(我更新了我的答案),但让用户知道他的行动是否成功将是一件好事 – torm

6

尝试这个

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

所以基本上是最后一个参数是你的HTML属性,如果你不不需要它在新窗口中打开...这是唯一的属性,所以只需传递null作为整个参数。

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> 

这适用于MVC5以及