【问题标题】:Make HttpPost request to an action method in an ASP.NET MVC controller向 ASP.NET MVC 控制器中的操作方法发出 HttpPost 请求
【发布时间】:2023-03-08 19:08:01
【问题描述】:

我正在尝试构建一个功能,我需要在我们的应用程序中创建候选人的个人资料。创建候选人的个人资料有两个步骤/用户界面:

1 - 创建模板...用户输入候选人信息的地方。

2 - 预览模板...在用户将个人资料添加到我们的系统后,将在此预览他们个人资料的外观。

我已经通过一个名为“CandidateController”的控制器创建了支持这些 UI 的视图,该控制器包含一些操作方法:

1- [HttpGet]“创建”返回一个创建模板。

[HttpGet]
public ViewResult Create()

2- [HttpPost] 返回预览模板的“预览”。

 [HttpPost]
 public ActionResult Preview(ProfileViewModel viewModel)

现在我需要实现的是在 Create 模板中有一个按钮/链接,它将调用控制器中的操作方法 [HttpPost] Preview。

挑战 我还想知道如果能够从第一个创建模板调用 HttpPost Preview 操作方法,模型绑定器是否可以为我加载 ViewModel 对象。

我正在寻找有关如何最好地实现此类功能的建议/帮助。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net-mvc http-post actionmethod


    【解决方案1】:

    挑战我也想知道是否有一种方法可以将模型绑定器 如果能够调用 HttpPost,将为我加载 ViewModel 对象 从第一个创建模板预览操作方法。

    您可以使用标准表单或 AJAX 调用来调用 Preview POST 操作,然后传递视图模型的所有属性值。您在此请求中传递的所有值都将是默认模型绑定器绑定的值。 an article 解释了默认模型绑定器如何期望为更复杂的结构(例如列表和字典)命名参数。

    AJAX 示例:

    $.ajax({
        url: '@Url.Action("Preview")',
        type: 'POST',
        data: { Prop1: 'value 1', Prop2: 'value 2' },
        success: function(result) {
            // TODO: do something with the result returned from the POST action
        }
    });
    

    如果您不想使用 AJAX,可以使用带有隐藏字段的标准表单:

    @using (Html.BeginForm())
    {
        @Html.Hidden("Prop1", "value 1")
        @Html.Hidden("Prop2", "value 2")
        ...
        <button type="submit">Preview</button>
    }
    

    【讨论】:

      【解决方案2】:

      好的,这是我必须解决的选项:

      • 正如 Darin 建议的那样,您可以使用 $.ajax(options) 以不显眼的方式使用,但问题是,只有在您想要进行部分页面更新或想要继续工作时,您才可能希望采用这种方式在同一视图中更新/转储新的 html。
      • 如果您不想使用 Ajax,而不是使用隐藏字段,您可以简单地使用 MVC 中的 TempData 属性,这就是我使用 TempData 实现目标功能的方式。 p.s.下面...

        [HttpPost]       
        public ActionResult Create(ViewModel viewModel)
        {
            this.TempData["profile"] = viewModel;
            return RedirectToAction("Preview");
        }
        
        
        public ActionResult Preview()
        {            
        
            if (TempData["profile"] != null)
            {
                return View((ViewModel)TempData["profile"]);
            }
        
            // Handle invalid request...
            return null;
        }
        

      所以,这个解决方案对我来说效果很好,我没有编写任何 JavaScript 或不必要的 HTML。并感谢 Darin 将我引向一个起点。

      【讨论】:

        猜你喜欢
        • 2018-10-09
        • 2019-03-30
        • 1970-01-01
        • 2010-12-15
        • 1970-01-01
        • 1970-01-01
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多