ASP MVC:将动态生成的提交表单绑定到多个对象

时间:2016-03-04 14:48:11

标签: asp.net-mvc

我正在做一个班级实验室,其中包括设计一个小型的Crowdfunding网站。当用户创建项目时,他会被要求为他的项目获得多少层奖励。如果此金额高于0,则会将其重定向到“奖励/创建”页面。 “创建”视图中包含一个表单,该表单根据用户想要的层数生成。

问题是我不知道如何使用一个提交按钮将“for”循环的每个实例链接到特定的“RewardViewModel”对象,以及如何将所有这些对象传递给“post”方法控制器。

这是控制器“获取”方法(我知道我可能不得不改变绑定到视图的模型):

declare @xml xml
set @xml = (select *
            from tableABC
            for xml auto, elements)

以下是观点:

public ActionResult Create(int projectid, int amountOfTiers )
    {
        ViewBag.AmountOfTiers = amountOfTiers;
        ViewBag.ProjectTitle = (from p in context.Projects where p.ProjectId == projectid select p).FirstOrDefault().Title;
        RewardViewModel model = new RewardViewModel { ProjectId = projectid };
        return View(model);
    } 

1 个答案:

答案 0 :(得分:1)

您希望创建RewardViewModel的集合,因此视图中的模型必须是集合。目前,您只传递一个RewardViewModel实例,然后使用for循环生成多个表单控件,其中包含重复的name属性(以及重复的id属性,这些属性是无效的html)。

更改GET方法以返回集合

public ActionResult Create(int projectid, int amountOfTiers)
{
    List<RewardViewModel> model = new List<RewardViewModel>();
    for(int i = 0; i < amountOfTiers; i++)
    {
        model.Add(new RewardViewModel { ProjectId = projectid });
    }
    ViewBag.ProjectTitle = (from p in context.Projects where p.ProjectId == projectid select p).FirstOrDefault().Title;
    return View(model);
} 

以及

的观点
@model List<RewardViewModel>
....
@using (Html.BeginForm("Create", "Reward", FormMethod.Post))
{
    for(int i = 0; i < Model.Count; i++)
    {
        @Html.HiddenFor(m => m[i].ProjectId)

        @Html.LabelFor(m => m[i].Title)
        @Html.TextBoxFor(m => m[i].Title)
        @Html.ValidationMessageFor(m => m[i].Title)
        ....
    }
    <input type="submit" value="Create" />
}

这将使用索引器正确命名您的控件,并将发布到

public ActionResult Create(List<RewardViewModel> model)

附注:删除new { @Value = tier }(在使用value方法时从不设置HtmlHelper属性)并且不清楚为什么要创建Tier属性{{1} - 它的值未在控制器中设置,并且无法在视图中更改,因此在视图中包含它似乎毫无意义。如果您想在属性中添加连续数字,请在控制器中执行此操作 - 例如readonly

另请注意,无需使用model.Add(new RewardViewModel { ProjectId = projectid, Tier = i + 1 }); - 如果显示文本与属性名称匹配,则只能为@Html.LabelFor(model => model.Tier, "Tier")