繁体   English   中英

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

[英]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>
}

如果TitleDescription不会被更改或显示在表单上,​​您也可以使用相同的方式保存它们。 此处的关键是如何根据要绑定它们的属性的名称设置每个<input>标记的namevalue属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM