0

モデルから正しく取り込まれているビューがあります。ビューのカットダウンは次のとおりです。

@model PickardOrdering.Models.ExhibitionItemModel

@foreach (var item in Model.Items)
    {
        <tr>
            <td>@Html.DisplayFor(modelItem => item.Code)</td>
            <td>@Html.DisplayFor(modelItem => item.Description)</td>
            <td>@Html.CheckBoxFor(modelItem => item.AdditionalItem.Value, new { @disabled = "disabled" })</td>
            <td>@Html.CheckBoxFor(modelItem => item.IsItemSelected.Value)</td>
            <td>£&nbsp;@Html.EditorFor(modelItem => item.ItemPrice)</td>
        </tr>
    }

<input type="submit" value="Save Items" />

データをコントローラーに戻すと、exhibitionitemmodel は null です。

[HttpPost, ActionName("CreateExhibitionItems")]
    public ActionResult CreateExhibitionItems(ExhibitionItemModel exhibitionitemmodel)
    {
        decimal decPrice;
        if (ModelState.IsValid)
        {
            List<tblExhibitionItem> lstExhibitionItem = new List<tblExhibitionItem>();
            IEnumerable<ItemWrapper> lstItemWrapper = from objExhibitionItemModel in exhibitionitemmodel.Items
                                                                                                                select objExhibitionItemModel;

使用されるモデル クラスは次のとおりです。

namespace PickardOrdering.Models
{
    public class ItemWrapper : tblItem
    {
        public decimal ItemPrice { get; set; }
        public bool? IsItemSelected { get; set; }
    }

    public class ExhibitionItemModel
    {   
        public IEnumerable<ItemWrapper> Items { get; set; }
        public tblExhibition Exhibition { get; set; }
        public IEnumerable<tblExhibitionItem> ExhibitionItems { get; set; }
    }    
}

モデル データが null である理由はありますか?

4

3 に答える 3

1

モデルで使用するすべてのクラス (それらによって使用される列挙型とクラスを含む) に、パラメーターなしのパブリック コンストラクターがあることを確認してください。

また、含まれているクラスをコンストラクターでインスタンス化します。モデル バインダーには、入力するオブジェクトのインスタンスが必要です。例を以下に示します。モデルで使用されるすべてのクラスに対してこれを行います。

public class ExhibitionItemModel
{   

    public ExhibitionItemModel(){
        Exhibition = new tblExhibition();
        ExhibitionItems = new List<tblExhibitonItem>();
        Items = new List<ItemWrapper>();
    }

    public IEnumerable<ItemWrapper> Items { get; set; }
    public tblExhibition Exhibition { get; set; }
    public IEnumerable<tblExhibitionItem> ExhibitionItems { get; set; }
}    

また、ビューでは、foreach ループではなく、インデックスを使用してアイテムを反復処理します。これは、モデル バインダーが理解できるインデックスを含む名前でビューが生成されるようにするためです。

于 2013-02-18T17:25:31.187 に答える
1

モデル バインディングを使いやすくするために、クラスの EditorTemplate を作成することをお勧めしますItemWrapper

// Views/<WhateverYourControllerIsCalled>/EditorTemplates/ItemWrapper.cshtml

@model PickardOrdering.Models.ItemWrapper

<tr>
        <td>@Html.DisplayFor(m => m.Code)</td>
        <td>@Html.DisplayFor(m => m.Description)</td>
        <td>@Html.CheckBoxFor(m => m.AdditionalItem.Value, new { @disabled = "disabled" })</td>
        <td>@Html.CheckBoxFor(m => m.IsItemSelected.Value)</td>
        <td>&nbsp;@Html.EditorFor(m => m.ItemPrice)</td>
</tr>

メインの .cshtml は次のようになります。

@model PickardOrdering.Models.ExhibitionItemModel

@using (Html.BeginForm("CreateExhibitionItems", "Home", FormMethod.Post))
{  
    <table>
    @Html.EditorFor(m => m.Items)
    </table>
    <input type="submit" value="Save Items" />
}

コレクションで EditorFor を使用するItemsと、リストにバインドするときにデフォルトのバインダーが期待する形式で html がレンダリングされます。より細かく制御したい場合は、インデックスと for ループを使用して手動で html をレンダリングできますが、この方法で処理されます。

これらの状況で役立つ一般的なヒントとして、FormCollectionポストを受信して​​いるアクション メソッドにパラメーターを追加し、デバッグ中にこのパラメーターを調べます。これは、どのデータがフォームから投稿されているかを確認するのに役立ち、そこから、モデル バインド中にデータがバインドされない理由を理解できます。

于 2013-02-18T18:13:42.330 に答える
0

CSHTMLこの記事を使用できるフォームはありますか このコードを使用する必要があります

@using (Html.BeginForm("CreateExhibitionItems", "controllerName", FormMethod.Post))
{  @foreach (var item in Model.Items)
    {
        <tr>
            <td>@Html.DisplayFor(modelItem => item.Code)</td>
            <td>@Html.DisplayFor(modelItem => item.Description)</td>
            <td>@Html.CheckBoxFor(modelItem => item.AdditionalItem.Value, new { @disabled = "disabled" })</td>
            <td>@Html.CheckBoxFor(modelItem => item.IsItemSelected.Value)</td>
            <td>£&nbsp;@Html.EditorFor(modelItem => item.ItemPrice)</td>
        </tr>
    }

<input type="submit" value="Save Items" />}
于 2013-02-18T17:13:46.717 に答える