0

EditorForModel残念ながら、タイプのプロパティを持つクラスでヘルパーを使用してICollection<int>いますが、ページにコントロールのレンダリングが表示されません。

サンプルは次のとおりです。

モデルビューオブジェクト

public class CopyFromVM
{

    [UIHint("MultiEntityList")]
    public ICollection<int> EntityIds { get; set; }
    ...
}

EditorTemplateフォルダーには、MultiEntityList.cshtmlファイルがあります。

@model ICollection<int>


<select name="@ViewData.ModelMetadata.PropertyName" id="@ViewData.ModelMetadata.PropertyName" multiple="multiple" >
 ...
</select>

フォームがレンダリングされるとき、私はどんな種類のエラーもありません。プロパティはレンダリングから無視されます。だから私はそれEditorForModelが複雑なタイプを無視しているのではないかと疑っています。Webを見ると、すべてのタイプで正しく機能するはずです。

助けてくれてありがとう。

4

1 に答える 1

2

以下は、メインビューからカスタムテンプレートを取得する必要があります。

@model CopyFromVM
@Html.EditorFor(x => x.EntityIds)

以下はしません:

@model CopyFromVM
@Html.EditorForModel()

その理由は、フレームワークが複雑なオブジェクトプロパティに再帰しないためです。このブログ投稿Object.cshtmlでBradWilsonが説明しているように、デフォルトのエディターテンプレートを変更できます(投稿の最後にあるShallow Dive vs. Deep Diveのセクションを参照してください)。

また、エディターテンプレートが正しいフォルダーに配置されていることを確認してください。質問に記載されているとおりでは~/Views/Shared/EditorTemplates/MultiEntityList.cshtmlありませんEditorTemplate(欠落していることに注意してくださいs)。


補足として、ネストレベルを考慮していないため、エディタテンプレート内で選択リストの名前とID属性を生成する方法は正しくありません。CopyFromVMたとえば、それがさらに別の親ビューモデルのプロパティとして使用されていると想像してください。この場合、selectの名前が間違っており、デフォルトのモデルバインダーは値を再水和できません。代わりに次を使用してください。

@model ICollection<int>
<select name="@ViewData.TemplateInfo.GetFullHtmlFieldName("")" id="@ViewData.TemplateInfo.GetFullHtmlFieldId("")" multiple="multiple" >
    ...
</select>

まあ、実際には、いいえ、あなたはすでにあなたのためにこの仕事をするヘルパーを持っています@Html.ListBox。ASP.NET MVCビューでHTMLフォーム要素をハードコーディングすることは、非常に壊れやすいプロセスのようですが、避けることをお勧めします。


さらにもう1つの注意点:選択リストを生成するには、通常、ビューモデルに2つのプロパティが必要です。1つは選択した値を保持し、もう1つはすべての値を保持します。エディターテンプレートを強く入力するのICollection<int>は、ここでは間違ったアプローチです。

于 2012-06-13T15:21:22.623 に答える