0

我是 MVC3 的新手,但到目前为止,我已经设法与我的代码相处得很好。

现在,我想做一个简单的表单,允许用户输入一个文本字符串,代表员工的姓名。然后,我希望将此表单提交并存储在我的模型中,以某种列表的形式。然后应该重新显示表单,并使用 for-each 循环写出我已经添加的名称。当我完成并继续前进时,我需要将此信息存储到我的数据库中。

我想不通的是如何存储这些临时信息,直到我将它推送到我的数据库中。每次提交时都推送我可以做到,但这让我很头疼。

希望你们看到我正在尝试做的事情,并有一个很棒的解决方案。:)

这是我一直在尝试做的简化版本:

模型

public class OrderModel
{
    public virtual ICollection<Employees> EmployeesList { get; set; }

    public virtual Employees Employees { get; set; }
}

public class Employees
{
    [Key]
    public int ID { get; set; }

    public string Name { get; set; }
}

看法

@model OrderModel
@{
    if (Model.EmployeesList != null)
    {
        foreach (var c in Model.EmployeesList)
        {
            @c.Name<br />
        }
    }
}
@using(Html.BeginForm())
{
    @Html.TextBoxFor(m => m.Employees.Name)

    <input type="submit" value="Add"/>
}

控制器

[HttpPost]
public ActionResult Index(OrderModel model)
{
    model.EmployeesList.Add(model.Employees);
    // This line gives me the error: "System.NullReferenceException: Object reference not set to an instance of an object."

    return View(model);
}
4

2 回答 2

1

我认为您应该通过将员工列表刻录到页面中来处理此问题。现在,你没有给你的表单任何识别列表的方式。

在名为 Employees 的 EditorTemplates 文件中:

@model Employees

@Html.HiddenFor(m => m.ID)
@Html.HiddenFor(m => m.Name);

在您看来:

@using(Html.BeginForm())
{
    @Html.EditorFor(m => m.EmployeesList)
    @Html.TextBoxFor(m => m.Employees.Name)

    <input type="submit" value="Add"/>
}

[HttpPost]
public ActionResult Index(OrderModel model)
{
   if (model.EmployeesList == null)
      model.EmployeesList = new List<Employees>();

    model.EmployeesList.Add(model.Employees);
    return View(model);
}

作为此方法的额外好处,添加 ajax 很容易,因此用户在添加新员工时不必离开页面(您可能只需使用 javascript 插入新的隐藏值并避免使用 ajax。这取决于如果您除了在您的帖子中添加到您的列表之外还有其他任何操作)。

于 2012-04-21T05:14:52.177 回答
1

我认为这对TempData很有用。您可以在其中存储任何内容,有点像缓存,但与缓存不同的是,它只会持续到下一个请求。要实现这一点,请像这样更改操作方法(仅示例):

[HttpPost]
public ActionResult Index(OrderModel model)
{
    dynamic existingItems = TempData["existing"];
    if (existingItems != null) 
    {
        foreach (Employee empl in existingItems)
            model.EmployeesList.Add(empl );
    }
    model.EmployeesList.Add(model.Employees);
    TempData["existing"] = model.EmployeesList;
    return View(model);
}
于 2012-04-21T04:54:43.113 回答