4

複合型をプロパティとして使用するモデルがあります。

namespace Web.Models {
    public class Business : IModel {
        [Key, HiddenInput(DisplayValue = false)]
        public Guid ID { get; set; }

        public Position Position { get; set; }

        public bool Active { get; set; }

        public ICollection<Comment> Comments { get; set; }

        public Business() {
            ID = Guid.NewGuid();
            Position = new Position();
        }
    }

    public class Position {
        public double Latitude { get; set; }
        public double Longitude { get; set; }
    }
}

Business モデルのフォームを作成しようとしたら、Position プロパティが表示されませんでした。MVC2ではデフォルトで複合型が表示されていたと思います。これが MVC3 のスイッチである可能性があると仮定して、次の手順を試してみましたが、役に立ちませんでした。

  1. 属性で Position プロパティを装飾しましたScaffoldColumn(true)
  2. Views\Shared\EditorTemplates に Position.cshtml ビューを作成しました。

私の現在の回避策は、カスタム Object.ascx を MVC2 から MVC3 Razor Object.cshtml に変換することでした。私のためらいは、私のカスタム Object.ascx が、Brad Wilson によってブログに書かれたオリジナルに基づいていることを確信していることです。

@if (ViewData.TemplateInfo.TemplateDepth > 1) {
    @ViewData.ModelMetadata.SimpleDisplayText
}
else {
    <div class="editor">
        @foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm))) {
      if (prop.HideSurroundingHtml) {
            @Html.Editor(prop.PropertyName)
      }
      else {
            <div class="field">
                @(prop.IsRequired ? "*" : "")
                @Html.Label(prop.PropertyName)
                @Html.Editor(prop.PropertyName)
                @Html.ValidationMessage(prop.PropertyName)
            </div>
      }
  }
    </div>
}

質問は次のとおりです。

  1. デフォルトの動作が変更されましたか、それとも何か不足していますか?
  2. 複合型の可視性をオンにするより良い方法はありますか?
  3. ASP.NET MVC3 の既定のテンプレートにアクセスできますか?

リッチ

4

1 に答える 1

0

デフォルトのObject.ascxテンプレートは、オブジェクトグラフの1つのレベルのみを表示します。

上部に、深度が1より大きいかどうかを確認し、レンダリングをベイルする線があります。

<% } else if (ViewData.TemplateInfo.TemplateDepth > 1) { %>

への変更:

<% } else if (ViewData.TemplateInfo.TemplateDepth > 99) { %> 

または、完全に削除します。

于 2010-12-15T13:03:02.723 に答える