【问题标题】:How to get value for IList<model> via form and pass it to controller in MVC如何通过表单获取 IList<model> 的值并将其传递给 MVC 中的控制器
【发布时间】:2016-09-15 04:07:42
【问题描述】:

我在过去两天摸不着头脑,包括我正在尝试构建的信息。

我正在尝试构建的功能: 简单的行程管理器应用程序

在索引页面上获取行程名称和人数的值并提交,这会导致另一个表单(视图)根据人数生成文本框并将该表单数据传递给另一个控制器,我将在其中保存进入数据库。

型号: 旅行

public class Trip
    {
        public Trip()
        {
            //people = new List<People>();
        }
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public decimal Income { get; set; }
        public decimal Expense { get; set; }
        public int NumberOfPeople { get; set; }
        public virtual IList<People> people{ get; set; }
    }

public class People
    {
        public int Id { get; set; }
        public int TripId { get; set; }
        [DisplayName("Name:")]
        public string Name { get; set; }
        [DisplayName("Initial Deposite:")]
        public decimal InitialDeposite { get; set; }


    }

这就是 Index.cshtml 视图的样子,这里我输入了两个输入名称和人数:

@model TripManager.Models.Trip
@{
    ViewBag.Title = "Welcome to Trip Manager";
}

<div class="jumbotron">
    <h1>Trip Manager</h1>
    <p class="lead">Trip Manager helps you calculate your group trip expenses in ease.</p>
</div>

<div class="row">
    <div class="col-md-12 text-center">
            @using (Html.BeginForm("Index","Trip"))
            {

                @Html.AntiForgeryToken();
                @*@Html.HiddenFor(m=>m.Id)*@
                <p class="text-info">@Html.LabelFor(m => m.Name)</p>
                <p class="glyphicon-search">@Html.EditorFor(m => m.Name) @Html.ValidationMessageFor(m => m.Name)</p>


                <p class="text-info">@Html.LabelFor(m => m.NumberOfPeople)</p>
                <p class="glyphicon-search">@Html.EditorFor(m => m.NumberOfPeople) @Html.ValidationMessageFor(m => m.NumberOfPeople)</p>
                <p><input type = "submit" class="btn-success" name="btnTripInit" value="Go Trip" /></p>
            }
    </div>
</div>

通过控制器后操作索引(旅行行程)将这些输入传递给 member.cshtml 视图,如下所示,

public ActionResult Index(Trip trip)
{
    if (!ModelState.IsValid)
    {
        return View(trip);
    }

    var mytrip = new Trip();
    mytrip.Name = trip.Name;
    mytrip.NumberOfPeople = trip.NumberOfPeople;
    mytrip.people = new List<People>(trip.NumberOfPeople);

    return View("Members", trip);
}

members.cshtml 视图如下...这里我正在为旅行模型中的 IList 生成文本框...一个用于名称的文本框和其他用于初始存款的文本框

@model TripManager.Models.Trip
{
   @ViewBag.Title = "Please Enter Members Details";
}
<div class="row">
    <div class="col-md-12 text-center">
      @{
          using (Html.BeginForm("FeedMemberData", "Trip",FormMethod.Post))
          {
            <hr />
            @Html.HiddenFor(m=>m.Id)
              for(int i=0;i<Model.NumberOfPeople;i++)
              {
                <p>Member @i Details</p>
                @Html.HiddenFor(m => m.people[i].Id)
                <p class="text-info">@Html.LabelFor(m=>m.people[i].Name) @Html.EditorFor(m => m.people[i].Name , new {@class="glyphicon-search"})
                 | @Html.LabelFor(m => m.people[i].InitialDeposite) @Html.EditorFor(m => m.people[i].InitialDeposite , new { @class = "glyphicon-search" })
                </p>
              }
            <hr />
            <p><input type="submit" class="btn-success" name="btnMemberInit" value="Save Details" /></p>
          }
    }
    </div>
</div>

现在我应该如何将此表单数据发送到控制器并通过 EntityFramework 将其保存到数据库???

public ActionResult FeedMemberData(Trip trip)
{
    //TODO
}

在这里旅行我得到了空......

【问题讨论】:

    标签: asp.net asp.net-mvc list razor ienumerable


    【解决方案1】:

    后来发现问题,做了一些更改,它工作了。

    一般说明:

    如果您遇到 Ienumerable 向控制器返回 null 等问题,请确保在向 IList 提供数据时从 0 开始索引

    @model TripManager.Models.Trip
    {
       @ViewBag.Title = "Please Enter Members Details";
    }
    <div class="row">
        <div class="col-md-12 text-center">
          @{
              using (Html.BeginForm("FeedMemberData", "Trip",FormMethod.Post))
              {
                <hr />
                @Html.HiddenFor(m=>m.Id)
                 //this must start from 0
                  for(int i=0;i<Model.NumberOfPeople;i++)
                  {
                    <p>Member @i Details</p>
                    @Html.HiddenFor(m => m.people[i].Id)
                    <p class="text-info">@Html.LabelFor(m=>m.people[i].Name) @Html.EditorFor(m => m.people[i].Name , new {@class="glyphicon-search"})
                     | @Html.LabelFor(m => m.people[i].InitialDeposite) @Html.EditorFor(m => m.people[i].InitialDeposite , new { @class = "glyphicon-search" })
                    </p>
                  }
                <hr />
                <p><input type="submit" class="btn-success" name="btnMemberInit" value="Save Details" /></p>
              }
        }
        </div>
    </div>
    

    【讨论】:

      【解决方案2】:

      如果您希望发布到控制器方法的 Trip 对象为空,我发现这通常是由于 html 页面未正确发布数据或 MVC 模型绑定器无法正确解决将数据放入您希望发布到服务器的模型中,在本例中为 Trip 对象。

      如果我猜的话,您发布到方法“FeedMemberData”的内容实际上是一个 People 数组,而不是您用作模型的 Trip 对象。试试下面看看模型绑定器是否会将帖子数据绑定到列表。

      [HttpPost]
      public ActionResult FeedMemberData(List<People> people)
      {
          //TODO
      }
      

      【讨论】:

      • 否 @Jonathan 实际上我正在发布 Trip,而我的 Trip 课程有 IList
      • @Pratham,对不起,我帮不上忙。您是否尝试过使用fiddler 之类的工具?通常,当我有一个控制器操作给我的数据不正确或我没有预料到时,我可以使用这个免费工具来准确诊断发送到服务器的内容。另请注意,我已编辑我的答案以包含 [HttpPost] 属性,因为当我从表单接收数据时,我希望明确说明我希望处理表单帖子的控制器操作。
      • thanx 关于提琴手@jonathan 的建议。我能够将正确的数据发布回控制器
      猜你喜欢
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 2015-08-23
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 2015-09-19
      相关资源
      最近更新 更多