我正在做一个班级实验室,其中包括设计一个小型的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);
}
答案 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")
。