[英]Passing Data from View to Controller using multiple textboxes
我目前正在制作一个用户活动时间表,用户可以在其中记录每个活动的时间。 我的问题是用户分配了不同数量的活动,因此我无法创建通用模型,也无法使用现有模型来接受输入参数。 我的替代方法是为每个活动创建单独的页面(这样我就可以直接为每个活动模型节省时间),但这显然效率很低。 那我该怎么做呢?
编辑:重申我的问题(我是MVC5的新手)。 在我看过的教程中,使用按钮将数据从View传递到控制器的方式是通过HTTPPOST进行的,其中控制器接受模型。 例如:
pubc class Model
{
public int id {get; set;}
public string name {get; set;}
}
public ActionResult Create()
{
return View();
}
Create.cshtml
@using (Html.BeginForm())
{
@Html.TextboxFor(mode.Name)
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
通过按下按钮,视图将模型传递到创建httppost
[HTTPPOST]
public ActionResult Create(Model model)
{
/*code here*/
}
现在这是我的问题,我有一个在视图中显示的用户活动列表(每个用户的活动数量不同)。
时间表中的Foreach活动将活动名称和文本框放入逻辑视图中,如下所示
Activity Hours Loggeed
<Activiti> 1 <textbox>
<Activiti> 2 <textbox>
<Activiti> 3 <textbox>
现在,我如何创建一个可以接受视图传递的模型的操作,并更新时间表中列出的所有活动的时间。
调节器
public ActioResult Time()
{
return View(Timesheet);
}
[HttpPost]
public ActionResult Time( /* What do I place here?*/)
{
}
时间表模型
public class TimeSheet
{
public int ID { get; set; }
public int UserID { get; set; }
public List<ActivityModel> Activities { get; set; }
public DateTime Day {get; set;}
}
基本上,时间表模型具有用户ID和在该特定日期分配给该用户的活动列表。
活动模型
public class ActivityModel
{
public int ID {get; set}
public string Title {get; set;}
public string Description {get; set;}
}
谢谢!
您可以在ActivityModel
类中添加Hours
属性,并使用该属性传递用户输入。 假设它是一个整数,这就是您的模型类的样子
public class TimesheetModel
{
public TimesheetModel()
{
this.Activities = new List<ActivityModel>();
}
public int ID { get; set; }
public int UserID { get; set; }
public List<ActivityModel> Activities { get; set; }
public DateTime Day { get; set; }
}
public class ActivityModel
{
public int ID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public int Hours { get; set; }
}
我相信控制器的get方法将是这样的
public ActionResult Time()
{
TimesheetModel model = new TimesheetModel();
model.Activities = ... // get activities here
return View(model);
}
视图代码将是这样,它将根据您在上面的控制器get方法中传递的Activities
生成文本框。
@model TimesheetModel
@using (Html.BeginForm())
{
<table>
<tr>
<th>
Activity
</th>
<th>
Hours Logged
</th>
</tr>
@for (int i = 0; i < Model.Activities.Count; i++)
{
<tr>
<td>@Model.Activities[i].Title</td>
<td><input type="text" name="Activities[@i].Hours" value="@Model.Activities[i].Hours" /></td>
</tr>
}
</table>
<button type="submit">Submit</button>
}
您可以将TimesheetModel
用于控制器发布方法
[HttpPost]
public ActionResult Time(TimesheetModel model)
{
foreach (var activity in model.Activities)
{
// pass activity.Hours to database here
}
}
当您提交表单并执行controller post方法时,所有用户输入值都将位于model.Activities
属性中,其顺序与文本框完全相同。 例如,如果在第二行中输入12
,则model.Activities[1].Hours
将为12
。
UPDATE
如果您还想传递ActivityModel
的其他属性,建议您使用隐藏字段。 下面是传递ID
属性的示例
@for (int i = 0; i < Model.Activities.Count; i++)
{
<tr>
<td>@Model.Activities[i].Title</td>
<td>
<input type="text" name="Activities[@i].Hours" value="@Model.Activities[i].Hours" />
<input type="hidden" name="Activities[@i].ID" value="@Model.Activities[i].ID" />
</td>
</tr>
}
如果Title
和Description
不会被更改或显示在表单上,您也可以使用相同的方式保存它们。 此处的关键是如何根据要绑定它们的属性的名称设置每个<input>
标记的name
和value
属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.