1

//製品

public class Product
{
    [Key]
    public int ID {get; set;}
    public string PK {get; set;}

    [Required(ErrorMessage="Category is required field.")]
    public int CategoryID { get; set; }

    [Required]
    public string Title {get; set;}

    public virtual ICollection<Pricing> Pricing { get; set; }
}

// 価格

public class Pricing
{
    [Key]
    public int ID {get; set;}
    public int ProductID {get; set;}
    public decimal Price {get; set;}
    public int OrderQty {get; set;}
    public string PK { get; set; }
}

上記のエンティティ テーブルがあり、製品更新ページでICollection の 5 つのテキスト ボックスを描画したいと考えています。でも、どうしたらいいのかわからない。

@model BrownieDAL.Entities.Product


<th> Price / Order Qty</th>
<td>
    @{int priceCnt = 0;}
    @foreach(var price in Model.Pricing){
        priceCnt++;
        @Html.TextBoxFor(model => price.Price)
        @Html.TextBoxFor(model => price.OrderQty)
        <br />
    }
    @if (priceCnt < 5)
    {
        // ??? 
        @Html.TextBoxFor(Model.Pricing => Model.Pricing.Price)
        priceCnt++;
    }
</td>

「@Html.TextBoxFor(Model.Pricing => Model.Pricing.Price)」で試したところ、次のエラーが表示されました。

Error   1   'System.Collections.Generic.ICollection<PJ.Entities.Pricing>' does not contain a definition for 'Price' and no extension method 'Price' accepting a first argument of type 'System.Collections.Generic.ICollection<PJ.Entities.Pricing>' could be found (are you missing a using directive or an assembly reference?)   

ICollection<> プロパティのテキストボックスを描画するにはどうすればよいですか?

4

1 に答える 1

4

エディター テンプレートを使用することをお勧めします。

したがってPricing、コントローラーでコレクションを初期化し、5 つの要素に完成させるだけです。

model.Pricing = ... go get the pricing collection from wherever you were getting it previously
int count = model.Pricing.Count();
if (count < 5)
{
    // we have less than 5 elements in the collection => let's complete it
    // with empty Pricing elements:
    var emptyItems = Enumerable.Range(1, 5 - count).Select(x => new Pricing());
    model.Pricing = model.Pricing.Concat(emptyItems).ToList();
}
return View(model);

次に、ビュー内で次のようにします。

@model BrownieDAL.Entities.Product
<table>
    <thead>
        <tr>
            <th>Price / Order Qty</th>
        </tr>
    </thead>
    <tbody>
        @Html.EditorFor(model => model.Pricing)
    </tbody>
</table>

次に、モデルのカスタム エディター テンプレートを定義するだけですPricing( ~/Views/Shared/EditorTemplates/Pricing.cshtml)。

@model BrownieDAL.Entities.Pricing
<tr>
    <td>
        @Html.TextBoxFor(model => model.Price)
        @Html.TextBoxFor(model => model.OrderQty)
    </td>
</tr>

シンプルに。ループやインデックスについて心配する必要はありません。ASP.NET MVC フレームワークがすべてを処理します。必要なのは、組み込まれている規則に従うだけです。

于 2013-02-19T15:33:10.057 に答える