2017-05-18 36 views
2

以下是情况。如何在服务器发布操作结果后打开新选项卡

我有一个保存和打印按钮:

<input name="btnSubmit" type="submit" value="Save" /> 
<input name="btnSubmit" type="submit" value="Print"/> @*Redirect to Action("Print", "controler")*@ 

必须打开一个新标签打印按钮。如果只是我,我显然知道我必须在打印之前保存......这不是问题。我可以使用与靶坯,而不是此链接:

<a target="_blank" href="@Url.Action("Print", "controler", new { id = Model.id })" type="submit" value="Print" > Print</a> 

容易的,但现在一些用户认为打印按钮还应保存网页。因为他们不推送保存...他们只是打印和模型更改丢失,因为我无法在我的打印链接中调用发布操作...这是一个链接。

我想,首先,我可以对保存fonction异步调用,但我的模型是太大了,它需要它自己行动的回发(右?)

通过此去:

How do I use Target=_blank on a response.redirect?

,我不知道这是否真的在MVC帮助...现在我在这里坚持:

[HttpPost] 
public ActionResult MyForm(string btnSubmit, formModel model) 
{ 
    if (btnSubmit == "Print") 
    { 
     dbSave(model); 
     return RedirectToAction("Print", "controler"); // Won't open new tab... 
    } 
} 

回答

3

在第1W母鸡用户点击打印按钮,我通过ajax请求发布我的数据,并成功完成后,我打开一个新的选项卡。

例子:

$.ajax({ 
    url: "@Url.Action("create", "Post")", 
    type: "POST", 
    contentType: "application/json", 
    data: JSON.stringify({ model: model}) 
}).done(function(result){ 
window.open('@Url.Action("Print", "controler", new { id = Model.id })', '_blank').focus(); 
}); 

OR

你想要写的东西就像HTTP响应你的榜样,那么你可以这样做

HttpContext.Current.Response.Write(@"<script type='text/javascript' language='javascript'>window.open('page.html','_blank').focus();</script>"); 

UPDATE

我已添加完整的testi流程下面的ng项目。

实施例:

型号:

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string ProductCode { get; set; } 
    public decimal Price { get; set; } 
} 

控制器:

public class ProductController : Controller 
    { 
     // GET: Product 
     public ActionResult Index() 
     { 
      return View(); 
     } 


     // GET: Product/Create 
     public ActionResult Save() 
     { 
      var model = new Product(); 
      return View(model); 
     } 

     // POST: Product/Create 
     [HttpPost] 
     public ActionResult Save(Product model, string saveButton) 
     { 
      if (ModelState.IsValid) 
      { 
       //do something 
       return 
        Json(
         new 
         { 
          redirectTo = Url.Action("Index", "Product", new { Area = "" }), 
          OpenUrl = Url.Action("Print", "Product", new { Area = "" }) 

         }); 
      } 
      return View(model); 
     } 
     public ActionResult Print() 
     { 
      return View(); 
     } 
} 

Save.cshtml:

@model Product 

@{ 
    ViewBag.Title = "Save"; 
} 

<h2>Save</h2> 
@Html.Hidden("saveButton","Test")@*Change Test to your value or change it to using JavaScript*@ 
@using (Html.BeginForm("Save", "Product", new {area = ""}, FormMethod.Post, new {id = "fileForm", name = "fileForm"})) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Product</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.ProductCode, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.ProductCode, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.ProductCode, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Price, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Price, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <button type="button" class="btn btn-primary" id="btnSave">Save</button> 
       <button type="button" class="btn btn-default">Print</button> 
      </div> 
     </div> 
    </div> 
} 

脚本:

<script> 
     $("#btnSave").click(function() { 
      $.ajax({ 
       url: $("#fileForm").attr('action'), 
       type: $("#fileForm").attr('method'), 
       beforeSend: function() { 
       }, 
       data: $("#fileForm").serialize() + "&saveButton=" + $("#saveButton").val() 
      }).done(function(result) { 
       if (result.OpenUrl) { 
        window.open(result.OpenUrl, '_blank'); 
       } 
       if (result.redirectTo) { 
        setTimeout(function() { 
          window.location.href = result.redirectTo; 
         },2000); 
       } 


      }); 
     }) 

    </script> 
+0

你的第二个方法,它在MVC工作? –

+0

我喜欢用几年来的东西。 – Ashiquzzaman

+0

@AntoinePelletier无法从控制器中打开一个新选项卡,这是一个UI关心的问题。因此,我认为这个答案在AJAX文章的正确路径上,但是应该实施一些额外的检查(例如AJAX文章的成功)。另外,你可以(应该)直接在''标签上放置一个点击处理程序,然后你可以从点击的对象中取出HREF,而不需要在JS中为打印URL提供剃须刀标记。我会远离MVC中的第二种方法,因为它只是给我一种肮脏的感觉:) – Tommy

相关问题