2

ViewModel

[Validator(typeof(ProdutoCategoriaValidator))]
public class ProdutoCategoriaViewModel
{
    [HiddenInput(DisplayValue = false)]
    public Guid ID { get; set; }

    public IEnumerable<SelectListItem> Tipos { get; set; }  // <<<<-------  Is not showing in my view

    [AdditionalMetadata("data-bind", "event: { change: function(data) { Link(data.Nome());  }}")]
    public string Nome { get; set; }

    [DataType(DataType.Url)]
    [AdditionalMetadata("Prefixo", "Produtos/{tipo-de-produto}#")]
    public string Link { get; set; }

    public int? Ordem { get; set; }

    public ProdutoCategoriaViewModel()
    {
        ID = Guid.NewGuid();
    }
}

解決

ソリューションエクスプローラー

表示(_Formulario.cshtml)

@model ProdutoCategoriaViewModel
@using (Html.BeginForm(null, null, FormMethod.Post, new { id="form-produtocategoria", data_bind = "submit: salvar" }))
{
    @Html.AntiForgeryToken()

    <legend>@Html.MvcSiteMap().SiteMapTitle()</legend>

    <fieldset>
        @Html.ValidationSummary(false, "Verifique os erros abaixo:")
        @Html.EditorForModel()
    </fieldset>

    <div class="buttons">
        @Html.ActionLink("Cancelar", "Index")
        <input type="submit" value="SALVAR" />
    </div>
}

SelectListItem.cshtml

@model IEnumerable<SelectListItem>

@Html.DropDownListFor(m => m, Model)

<p>Test</p>

結果

完全な画像: http: //i.imgur.com/I7HxA.png

結果を表示

ノート

  • 属性「UIHint」を入れようとしましたが、まだ何も表示されません!

質問

私は何が間違っているのですか?

4

2 に答える 2

3

デフォルトでは、使用するときに、これがタイプのHtml.EditorForModelプロパティなどの複雑なプロパティに再帰することを期待しないでください。Brad Wilson は、彼のブログ投稿でこれを説明しました(より具体的には、投稿の最後にある、Shallow Dive と Deep Diveのセクションをお読みください)。これを行うには、オブジェクト タイプのカスタム エディタ テンプレートを作成する必要があります。TiposIEnumerable<SelectListItem>

もう 1 つの可能性は、テンプレート名を指定することです。

@Html.EditorFor(x => x.Tipos, "SelectListItem")

また、DropDownListFor を最初の引数としてモデルにバインドしているため、のエディター テンプレートSelectListItemが間違っていることに注意してください。このヘルパーの最初の引数は、選択した値を保持するために使用されるスカラー プロパティでなければならないことを忘れないでください。これには、ビュー モデルに文字列または整数のプロパティが必要です。2 番目の引数はコレクションを表します。

エディター テンプレートに関するもう 1 つの重要な側面は、型のプロパティがIEnumerable<T>あり、このエディター テンプレートと呼ばれるエディター テンプレートが、テンプレートの場合とは異なり、クラスT.cshtmlに対して厳密に型指定されている必要があることです。これは、UIHint を使用するか、テンプレート名を EditorFor ヘルパーの 2 番目の引数として指定する場合には適用されません。この場合、テンプレートはコレクションに入力されます。TIEnumerable<T>SelectListItem.cshtml

_Formulario.cshtml要約すると、Brad Wilson が提案したように複雑なプロパティに再帰するカスタム オブジェクト エディター テンプレートを実装するか、個々の要素ごとに EditorFor を指定するようにビューを変更することができます。

于 2012-03-15T16:51:36.570 に答える