我目前正在制作用户活动时间表,用户可以在每个活动中记录他们的小时数。我的问题是用户分配了不同数量的活动,因此我无法创建通用模型或我们现有的模型来接受输入参数。我的替代方案是为每个活动分别设置页面(因此我可以直接保存个别活动模型的小时数),但这显然效率低下。那我该怎么做呢?
编辑: 重申我的问题(我是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;}
}
基本上,Timesheet模型具有用户ID以及在该特定日期分配给该用户的活动列表。
活动模型
public class ActivityModel
{
public int ID {get; set}
public string Title {get; set;}
public string Description {get; set;}
}
谢谢!
答案 0 :(得分:1)
您可以在Hours
类中添加ActivityModel
属性,并使用该属性传递用户输入。假设它是一个整数,这就是你的模型类看起来像什么
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
}
}
当您提交表单并执行控制器发布方法时,所有用户输入值都将位于model.Activities
属性中,其顺序与文本框完全相同。例如,如果您在第二行输入12
,则model.Activities[1].Hours
将为12
。
<强>更新强>
如果您还想传递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
。这里的关键是如何根据要绑定到的属性的名称设置每个name
标记的value
和<input>
属性。