【问题标题】:Execute code on Post request in ASP.NET MVC在 ASP.NET MVC 中对 Post 请求执行代码
【发布时间】:2015-03-20 13:47:35
【问题描述】:

我是 ASP.NET MVC 的新手,想知道如何执行以下操作:

我有一个带有一些按钮的列表,如下所示:

@model List<SitefinityWebApp.Mvc.Models.ProfileModel>

@using (Html.BeginForm())
{
   <ul>
      @foreach (var item in Model)
      {
         <li>
            <span>@item.EmailAddress</span>
            <button id="submit">Generate code</button>
        </li>
      }
   </ul>
}

所以当用户点击按钮时,我需要在需要电子邮件地址作为参数的服务器上执行一些代码。

我想我需要一个 POST,但我不确定如何设置它。最后,我希望再次呈现相同的列表。

我尝试了 ActionLink,但这仅适用于我理解的 GET 请求?

关于如何做到这一点的任何想法?

谢谢, 丹尼尔

【问题讨论】:

  • 您可以为每个电子邮件地址创建 1 个表单并放置一个隐藏的表单域。
  • 帖子是使用 HTML 表单生成的,请参阅:What is the difference between POST and GET?。因此,要将一些数据作为帖子发送到控制器,您需要添加一个表单和一个提交按钮。
  • 这听起来就像一个普通的 POST 到控制器方法。
  • @Liam 您的评论听起来好像无法使用表单输入形成 GET 请求。虽然我知道你的意思,但不是很好理解。

标签: c# asp.net asp.net-mvc razor razor-2


【解决方案1】:

您可以在 Controller 中定义 POST 功能。与 GET 调用同名。
您的 Get Call 应该是这样的:

public ActionResult Index()
{
    List<ProfileModel> list = new List<ProfileModel>();
    list.add(listItem);

    return View(list);
}

然后做POST函数:

[HttpPost]
public ActionResult Index(List<ProfileModel> postModel)
{
    var emailAddress = postModel.EmailAddress
    // do some stuff here

    return RedirectToAction("Index");
}

您可以使用 Html.BeginForm 中的参数调用任何 POST 函数:

@using (Html.BeginForm("MothodeName", "ControllerName", FormMethod.Post))
{
<!-- form here -->
}

【讨论】:

  • 但这是否意味着一个表单知道我点击了哪个按钮?我的意思是 Post 接受 postModel,但它不应该接受 List 吗?
  • 是的,您应该会收到一份 profilemodel 列表。正确
  • 无法用手机编辑我的答案...我稍后在我的电脑上更改它
【解决方案2】:

您想要做什么并不完全清楚。目前,您在单个表单中呈现多个按钮,但该表单没有控件,因此不会回发任何内容(并且由于您没有指定按钮 type 属性,它可能不会触发提交,具体取决于浏览器)。解决此问题的一种方法是为每个项目创建一个表单(指定一个路由参数),该表单回发电子邮件地址,然后重定向回索引页面。

@foreach (var item in Model)
{
  <span>@item.EmailAddress</span>
  @using (Html.BeginForm("ProcessEmail", new { emailAddress = item.EmailAddress }))
  {
    <button type="submit">Generate code</button>
  }
}

POST 方法是

[HttpPost]
public ActionResult ProcessEmail(string emailAddress)
{
  // do something with the email
  return RedirectToAction("Index"); // redisplay the page
}

或者,您可以使用隐藏输入而不是路由参数

@foreach (var item in Model)
{
  <span>@item.EmailAddress</span>
  @using (Html.BeginForm("ProcessEmail"))
  {
    @Html.HiddenFor(m => item.EmailAddress , new { id = "" }) // remove the id attribute to prevent invalid html
    <button type="submit">Generate code</button>
  }
}

但是,为了获得更好的性能并避免每次都重新生成视图,您可以使用 ajax 来发布值

@foreach (var item in Model)
{
  <span>@item.EmailAddress</span>
  <button type="button" class="process-email" data-email="@item.EmailAddress">Generate code</button>
}

var url = '@Url.Action("ProcessEmail")';
$('.process-email').click(function() {
  $.post(url, { emailAddress: $(this).data('email') }, function(response) {
    if(response) {
      // processing succeeded - display message?
    } else {
      // processing failed = display error?
    }
  })
})

并将方法修改为

[HttpPost]
public JsonResult ProcessEmail(string emailAddress)
{
  // do something with the email
  return Json(true); // or return Json(null) if an error occured
}

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多