如何调用没有视图的动作方法

时间:2015-06-23 14:34:26

标签: c# asp.net-mvc

我想在控制器中调用一个动作方法。但是actonmethod没有观点。

我有这个:

 <div class="col-lg-6 col-md-8 col-sm-10 ">       
        <a href="@Url.Action("GeneratePDFFFromHtml", "Product")" class="btn btn-primary enabled"><i class="fa fa-fw fa-check"></i> @Resources.Action.Navigation.GeneratePDF </a>      
    </div>

这是我的行动方法:

[HttpPost]    
public ActionResult GeneratePDFFFromHtml(EditProductModel model, string data)
{           
    SubmittedForm sf = new SubmittedForm();
    string schema = requestSchema;
    customer_DbConnection db = new customer_DbConnection();
    RenderFormController renderController = new RenderFormController();
    renderController.GeneratePdf(data, db,sf);
    //return RedirectToAction(model.DesignId, "Prdocut/Edit");
    return Content("It works");           
}

4 个答案:

答案 0 :(得分:1)

如果你想根据按钮/链接做一些工作,为什么不只是使用ajax调用?

例如:

<div class="col-lg-6 col-md-8 col-sm-10 ">       
    <button onclick=GeneratePdf('@Model.DesignId', <string data>) class="btn btn-primary enabled"><i class="fa fa-fw fa-check"></i> @Resources.Action.Navigation.GeneratePDF </button>      
</div>

在你的.cshtml中,我建议在文件的底部放一个脚本部分:

@section Scripts{
    <script type="text/javascript">
        //modify as needed to make it pass in what you need.
        function GeneratePdf(designId, stringData) {
            $.ajax({
            url: "@Url.Action("GeneratePDFFFromHtml","Product")",
            data: { designId: designId, strData: stringData },
            cache: false,
            contentType: false,
            processData: false,
            type: "POST",
            success: function (data) {
                //TODO: Add whatever if you want to pass a notification back
            },
            error: function(error) {
                //TODO: Add some code here for error handling or notifications
            }
        }
    </script>
}

然后,在您的控制器中,您可以让您的函数返回void。注意:我不确定你是否需要传递DesignId,但是你有它在那里我会保留它。您最有可能需要更多地编辑此方法以使其正常工作,但希望这会让您前进。

[HttpPost]    
public void GeneratePDFFFromHtml(string designId, string strData)
{           
    SubmittedForm sf = new SubmittedForm();
    string schema = requestSchema;
    customer_DbConnection db = new customer_DbConnection();
    RenderFormController renderController = new RenderFormController();
    renderController.GeneratePdf(strData, db, sf);
    //return RedirectToAction(model.DesignId, "Prdocut/Edit");       
}

此外,这将是异步的,因此您可能需要向用户发出一些通知,表示某些操作正在像微调器那样完成。

答案 1 :(得分:0)

尝试使用System.Web.Mvc.EmptyResult或重定向到同一页面 System.Web.Mvc.RedirectResult。

答案 2 :(得分:0)

更简单的方法是使用路由,路由属性与您的控制器如下。

在您的控制器中,只需确定所需的路线并添加即可。我使用了 ImportExport

[Area("Exporting")]
[Route("api/ImportExport")]
public class ImportExportController : Controller
{
    ............

    [Route("GeneratePDF")]
        [HttpPost]    
            public void GeneratePDFFFromHtml(string designId, string strData)
            {           
                SubmittedForm sf = new SubmittedForm();
                string schema = requestSchema;
                customer_DbConnection db = new customer_DbConnection();
                RenderFormController renderController = new RenderFormController();
                renderController.GeneratePdf(strData, db, sf);
                //return RedirectToAction(model.DesignId, "Prdocut/Edit");       
            }

    .......

在您的cshtml页面中,只需按以下方式调用此路径

即可
<form enctype="multipart/form-data" method="post" action="~/api/ImportExport/GeneratePDF" id="frmGenerate" novalidate="novalidate" class="form-horizontal">
.....

答案 3 :(得分:0)

谢谢安迪·科尔涅耶夫!!!您的示例代码帮助我解决了我一整天都在努力解决的问题。在没有刷新/查看的情况下运行代码块功能后,我使用了您的代码(并稍微修改了它)返回。

return Content("<script type='text/javascript'>window.history.back();</script>");

我知道这真的很旧,但希望你能看到。