在mvc4页面上有多个表单,提交一个表单

时间:2013-05-27 13:43:24

标签: asp.net-mvc-4 model-binding

我遇到了列出多个表单的问题,包括提交按钮。 单击第一个按钮时,它会正确发布,但是当我单击第二个提交按钮时,它会提交一个空集合... 以下是我的代码:

Index.cshtml

@model MVCFormsSubmitting.Models.FormsRepository
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>
@for (int i = 0; i < Model.UserInfo.Count; i++)
{
    using (Html.BeginForm("Index", "Forms", FormMethod.Post, new {name = "Form" + @i}))
    {
         <b>@Html.EditorFor(m => m.UserInfo[i].Name)</b>
         <input name="button @i" type="submit" class="left btn btn-primary" value="Ret navne">
         <br/>
    }
}

Formsrepository.cs

namespace MVCFormsSubmitting.Models
{
  public class Info
  {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Age { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
  }

  public class FormsRepository
  {
    public FormsRepository ()
    {
      this.UserInfo = new List<Info>();
    }

    public List<Info> UserInfo { get; private set; }

    public async Task Load()
    {
      this.UserInfo.Clear();
      UserInfo = await LoadUsers();

    }

    public async static Task<List<Info>> LoadUsers()
    {
      List<Info> info = new List<Info>();

      info.Add(new Info(){
        Age = "32,",
        Email = "mail@mail.com",
        Name = "John Doe",
        Phone = "123456749",
        Id = 0

      });

      info.Add(new Info()
        {
          Age = "36",
          Email = "exmaple@example.com",
          Name = "Jane Doe",
          Phone = "987654321",
          Id = 1
        });

      return info;
    }
  }
}

FormsController.cs

public class FormsController : Controller
{
  //
  // GET: /Forms/
  public ActionResult Index()
  {
    FormsRepository.Load();

    return View(FormsRepository);
  }

  [HttpPost]
  public ActionResult Index(FormsRepository text)
  {
    return RedirectToAction("Index");
  }

  private static FormsRepository _repository;

  public static FormsRepository FormsRepository
  {
    get
    {
      if (_repository == null)
      {
        _repository = new FormsRepository();
      }

      return _repository;
    }
  }
}

在FormsController中的HttpPost操作中设置断点时,您会看到当点击第一个提交按钮时会发送1个项目,但是当点击第二个按钮时该项目为空...

请帮助:)

2 个答案:

答案 0 :(得分:5)

我做了一些更改以使此代码正常工作!

1)更改控制器/视图以将每个UserInfo渲染为强类型的局部视图:

// This method will receive an info to process, so the model binder will build the model    back in the server correctly
[HttpPost]
public ActionResult Index(Info userInfo)
{
  return RedirectToAction("Index");
}

// This method will render a partial view for a user info
[ChildActionOnly]
public ActionResult GetUserInfo(Info userInfo)
{
  return PartialView("_UserInfo", userInfo);
}

2)更改视图以呈现存储库中每个用户信息的部分视图:

@model MVCFormsSubmitting.Models.FormsRepository
@{
   ViewBag.Title = "Index";
   Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>
@for (int i = 0; i < Model.UserInfo.Count; i++)
{
  {Html.RenderAction("GetUserInfo", Model.UserInfo[i]);}
}

3)创建部分视图以呈现用户信息“_UserInfo”:

@model MVCFormsSubmitting.Models.Info

@using (Html.BeginForm("Index", "Forms", FormMethod.Post, new { id = "Form" + @Model.Id, name = "Form" + @Model.Id }))
{
  <b>@Html.EditorFor(m => m.Name)</b>
  <input id="button_@Model.Id" name="button_@Model.Id" type="submit" class="left btn btn- primary" value="Ret navne">
  <br/>
}

答案 1 :(得分:-2)

试试这个:

.... 使用(Html.BeginForm(“Index”,“Forms”,FormMethod.Post,new {name =“Form”+ i.ToString()})) ....