对ASP.NET MVC控制器中的操作方法发出HttpPost请求

时间:2011-12-09 19:14:29

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

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

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

2 - 预览模板...用户将看到他们的个人资料在我们的系统中添加个人资料后的样子预览。

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

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

[HttpGet]
public ViewResult Create()

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

 [HttpPost]
 public ActionResult Preview(ProfileViewModel viewModel)

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

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

我正在寻找关于如何最好地实现这种功能的建议/帮助。

任何帮助都将深受赞赏。

2 个答案:

答案 0 :(得分:3)

  

挑战我也想知道模型绑定器是否有方法   如果能够调用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>
}

答案 1 :(得分:1)

好的,所以这里有我必须解决的选项:

  • 正如Darin建议您可以使用$ .ajax(选项)以不引人注目的方式使用,但是,只有当您想要进行部分页面更新或者如果您想要处理时,您可能想要这样做在同一视图中更新/转储新的HTML。
  • 如果您不想使用Ajax,而不是使用隐藏字段,您可以简单地在MVC中使用TempData属性,这就是我使用TempData实现目标功能的方式。 p.s.below ...

    [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。并且感谢达林指导我到一个起点。