使用多个文本框将数据从View传递到Controller

时间:2014-05-21 05:42:53

标签: c# asp.net-mvc entity-framework visual-studio

我目前正在制作用户活动时间表,用户可以在每个活动中记录他们的小时数。我的问题是用户分配了不同数量的活动,因此我无法创建通用模型或我们现有的模型来接受输入参数。我的替代方案是为每个活动分别设置页面(因此我可以直接保存个别活动模型的小时数),但这显然效率低下。那我该怎么做呢?

编辑: 重申我的问题(我是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;}
}

谢谢!

1 个答案:

答案 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>
}

如果不在表单上更改或显示,您也可以使用相同的方式保存TitleDescription。这里的关键是如何根据要绑定到的属性的名称设置每个name标记的value<input>属性。