【问题标题】:MVC How to call controller post methodMVC如何调用控制器post方法
【发布时间】:2014-11-30 12:30:42
【问题描述】:

您好,我对 Web 开发很陌生,并且被困在一个特定的场景中。

我有一个带有 2 种方法的地图控制器:

public ActionResult Map1(double easting, double northing)
public ActionResult Map2(double easting, double northing)

当被调用时,它们都使用所需的任何模型导航相应的视图:

return View(model);

然后我有一些 javascript 需要根据传递的操作调用相应的控制器方法。

我想将控制器方法标记为 [HttpPost],但是当我这样做时,然后在 javascript 中使用 ajax 请求,对 View 的调用被吞没并且页面没有被重定向。

目前我让它工作的唯一方法是:

window.location.href = '/Map/' + actionVal + '?easting=' + easting + '&northing=' + northing;

但是使用它我无法将方法设置为 POST。

有没有人对我应该如何做到这一点有更好的想法?

【问题讨论】:

  • Ajax 调用保持在同一页面上。从您的 cmets 到其他答案,我怀疑您不了解 GET 和 POST。为什么需要使方法[HttpPost]
  • 啊,好吧,ajax 调用留在同一页面上更有意义,这显然不是我的场景的正确方法,因为我想根据传递的操作转到不同的页面通过
  • @NAJ,要转到另一个视图,请查看我的答案。
  • 谢谢@ramiramilu,您的回答对我所追求的更有希望,只是不确定我在javascript方法中放入了什么来启动表单的提交?
  • 一个简单的 $("$FormId").submit(); 将提交该 ID 的表单。

标签: javascript ajax asp.net-mvc


【解决方案1】:

有没有人对我应该如何做到这一点有更好的想法?

其实你不需要TWO不同的Controller动作,你可以只有ONE。此操作将返回您要显示的视图。

创建 POST 的一种方法是使用 HTML.BeginForm() 并将控制器和操作名称与 FormMethod.POST 一起传递给 BeginForm()。在 BeginForm 中,您可以有一个提交类型的 HTML 输入按钮来对控制器操作进行 POST 调用。

此外,如果您想区分此控制器操作的调用,我建议您这样做 -

首先使用Type 变量构建您的模型,通过它您可以区分您需要对数据执行的操作 -

public class Details
{
    public string easting { get; set; }
    public string northing { get; set; }
    public string type { get; set; }
}

让你的控制器动作像这样定义 -

[HttpPost]
public ActionResult Map(Details details)

你可以让你的视图像这样定义一个HiddenField -

@model Namespace.Details

@{
    ViewBag.Title = "Title";
}

<div id="uploadCourseList">
    @using (Html.BeginForm("Action", "Controller", FormMethod.Post))
    {
        @* Other properties of Model *@
        @Html.HiddenFor(m => m.type)
        <input type="submit">
    }
</div>

现在在视图上设置type,以便您可以区分后期操作并对数据执行必要的计算并返回视图。

【讨论】:

  • 但是javascipt方法中的HTML.BeginForm()怎么办呢?
  • 为什么要使用 JAvaSCript 方法制作POST
  • 非常感谢@ramiramilu 我现在可以正常工作了,如果我让任何人感到困惑,我深表歉意,但正如我所说,我对 Web 开发还很陌生,所以边走边学
  • @NAJ 您的问题标题是使用 javascript 但此解决方案不使用 javascript!!!!!!!!!!!!!
  • 但是我是,我从 javascript 方法发起请求,感谢@ramiramilu $("$FormId").submit(); 语法已经完成了技巧
【解决方案2】:

您正在发送 GET 请求。因为您将参数映射到 queryString

如果你想这样使用它,你应该在动作中添加[HttpGet] 属性。但我更建议您在 AJAX 请求中使用 HttpPost

编辑:既然你使用 POST 请求应该是这样的

$.ajax({
    type: "POST",
    url: '/Maps',
    contentType: "application/json; charset=utf-8",
    data: {easting: easting, northing: northing}, //Maps the controller params
    dataType: "json",
    success: function() { alert('Success'); }
    });

【讨论】:

  • 是的,我正在尝试使用 [HttpPost],但不知道如何?
  • 你试过像@M.Azad 说的那样吗?那应该可以工作
  • 我刚刚尝试过,但由于某种原因它没有达到我的控制器方法
  • 如果你使用 MVC,dataType 应该是 dataType: "html/text" not json
  • @RudyHinojosa 取决于控制器的配置
【解决方案3】:

您可以使用此代码:

//Client Side
$.ajax({
    type: "POST",
    url: '@Url.Action("FirstAjax", "AjaxTest")',
    contentType: "application/json; charset=utf-8",
    data: {id :1},
    dataType: "json",
    success: function(result) {
    alert(result);
    window.locationre=result.url;
    }
    });
//AjaxTest Controller
[HttpPost]
public ActionResult FirstAjax(string id)
{

 return Json(new {url="URL"});

}

【讨论】:

  • 我正在尝试你的答案,但它没有达到控制器方法,我的网址为url: '@Url.Action("'+actionVal+'", "Map")',
  • 如果我将 [HttpPost] 属性从控制器方法和类型:ajax 请求中的 POST 现在命中该方法,但它没有重定向到视图,您有什么想法吗?
  • @NAJ 我更新了我的答案。在 ajax 模式下,您无法从控制器重定向。您可以将您的 url 发送到客户端并使用 javascript“window.locationre”重定向。请检查我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多