如何在C#ASP.NET MVC中的一个视图中创建多个条目?

时间:2010-07-07 20:45:44

标签: c# asp.net asp.net-mvc multiple-models

我有公司模型和员工模型,我想创建一个公司,然后在一个视图中为公司创建多个员工。

我应该如何在视图中执行此操作?

我应该在Create POST方法中做些什么来支持这个多条目视图?

4 个答案:

答案 0 :(得分:1)

我真的不知道你在说什么,但这里有一个狂野猜测:一个条目Foo,多个enries,IEnumerable<Foo>。听起来很熟悉?

答案 1 :(得分:0)

如果我理解这个问题,我认为这篇文章是相关的: http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

我的建议是通过适当地命名字段来尝试利用默认模型绑定器的行为。有关各种情况的具体命名约定,请参阅文章。

编辑:在下面添加了示例视图逻辑。注意,使用第三个参数调用Html.Hidden和Html.Input作为具有指定id属性的匿名类型实际上并不是必需的;我希望确保这些函数不会生成具有无效id属性(包含方括号)的HTML元素。

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
        <title>Example</title>
</head>
<body>
        <div><%
// Get your list of data objects from the model somehow.  This will be specific to your model
IEnumerable<MyData> items = Model as IEnumerable<MyData>;

// if there are items
if (items != null)
{
    // then iterate over them to create fields inside of a form
    using (Html.BeginForm())
    {
        int itemIndex = 0;
        foreach (var item in items)
        { %>
            <div>
                <%= Html.Hidden("MyData[" + itemIndex + "].MyDataID", item.MyDataID, new { id = "MyData_" + itemIndex + "_MyDataID" })%>
                <%= Html.TextBox("MyData[" + itemIndex + "].FirstName", item.FirstName, new { id = "MyData_" + itemIndex + "_FirstName" })%>
                <%= Html.TextBox("MyData[" + itemIndex + "].LastName", item.LastName, new { id = "MyData_" + itemIndex + "_LastName" })%>
            </div><%
                             itemIndex++;
        }
    }   
} %>
        </div>
</body>
</html>

然后,您可以在控制器中使用操作方法来处理发布的数据:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Example(IList<MyData> MyData)
    {
        // the MyData parameter will automatically be populated by the default ModelBinder using the values stored in the form collection (the posted data).
    }

答案 2 :(得分:0)

如果默认模型绑定器(将表单值转换为您在操作方法中用作参数的对象的对象)不足以满足您的需要,您可以考虑使用custom model binder

答案 3 :(得分:0)

我想我知道你要求的是什么。您需要将公司和多个员工传递给视图,以便对其进行强类型化。如果我错了,请告诉我。

当我在视图中需要多个对象时,我会创建一个“ViewModel”类。我通常在一个单独的项目中创建域模型,然后使用MVC项目中的models文件夹来存放我的ViewModel。

所以创建一个这样的类

public class SampleViewModel
{

     public SampleViewModel() { }

     public Company Company { get; set; }

     public IEnumerable<Employee> Employees { get; set; }

}

现在将您的视图绑定到示例视图模型。

public ViewResult SampleAction(SampleViewModel svm)
{
     if (svm == null)
          svm = new SampleViewModel() { Company=/*getcompany*/, Employees=/*get ienumerable employees */ };
}

这项技术很好地满足了我的目的。希望这是你想要的。

编辑:我读了你的一条评论弗雷德,我一定不能有足够的代表来回复其他答案或者什么(抱歉,我是新人)。要在视图中动态生成这些字段,您首先要将UI绑定到公司字段(Model.Company),然后通过IEnumerable(Model.Employees)进行枚举,并在每个字段上创建任何必要的UI。我对ASP.NET MVC比较陌生,所以我不确定它会如何影响POST上的模型绑定,但是我非常确定你可以在你的action方法中迭代post值并创建一个IEnumerable列表绑定回ViewModel。

如果视图上的字段数是动态的,并且您获得了X个员工,那么您必须遍历帖子集合以将它们绑定到ViewModel。从那里,您可以为公司和员工做任何您需要的事情,将它们插入您的域模型等。

如果您是第一次加载表单,则可能不会在列表中包含任何员工,因此不会加载UI。您需要检查列表的大小,如果为零则生成一组绑定到Employee的UI组件。然后,您可能会使用javascript按钮添加另一名员工,该员工可以根据需要多次复制这组UI。