簡體   English   中英

如何在 C# ASP.NET MVC 的一個視圖中創建多個條目?

[英]How do I create multiple entries in one view in C# ASP.NET MVC?

我有一個公司模型和一個員工模型,我想創建一個公司,然后在一個視圖中為公司創建多個員工。

我應該如何在視圖中執行此操作?

而在 Create POST 方法中我應該怎么做才能支持這種多入口視圖?

我真的不知道你在說什么,但這是一個瘋狂的猜測:一個條目Foo ,多個條目, IEnumerable<Foo> 聽起來很熟悉?

如果我理解這個問題,我認為這篇文章是相關的: 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).
    }

如果默認模型綁定器(將表單值轉換為您在操作方法中用作參數的對象的對象)不足以滿足您的目的,您可以考慮使用自定義模型綁定器

我想我知道你在問什么。 您需要將一個公司和多個員工傳遞給視圖,以便它們是強類型的。 如果我錯了,請告訴我。

當我在視圖中需要多個對象時,我會創建一個“ViewModel”類。 我通常在一個單獨的項目中創建域模型的東西,然后我使用 MVC 項目中的模型文件夾來容納我的 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 上的模型綁定,但至少我確信您可以遍歷操作方法中的 post 值並創建一個 IEnumerable 列表綁定回您的 ViewModel。

如果視圖上的字段數量是動態的,並且您返回 X 名員工,那么您必須遍歷帖子集合以將它們綁定到您的 ViewModel。 從那里你可以對公司和員工做任何你需要的事情,將他們插入你的域模型等。

如果您是第一次加載表單,則列表中可能不會有任何員工,因此不會加載任何 UI。 您需要檢查列表的大小,如果為零,您將生成一組綁定到 Employee 的 UI 組件。 然后,您可能會使用 javascript 按鈕添加另一名員工,該員工根據需要多次復制這組 UI。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM