3

私は以下のモデルを持っています:

public class Car
{
    public int Id { get; set; }
    public string Colour { get; set; }
    public Category Category { get; set; }
}
public class Category
{
    public int CatId { get; set; }
    public string Name { get; set; }
}

以下のように表示するモデルを返します。

 public ActionResult Index()
    {
        var car = new Car { Id = 1, Colour = "Black", Category = new Category { CatId = 2, Name = "Audi" } };

        return View(car);
    }

私の見解は:

@model MvcApplication6.Models.Car

@{
ViewBag.Title = "Car";
 }

@Html.DisplayForModel()

これはカテゴリを表示していません。これは MVC のバグであることがわかりました。回避策として、Object.ascx displaytemplate をオーバーライドする必要があります。

そこで、Views/Shared/DisplayTemplates/ フォルダーに object.cshtml を追加しました。コードは以下のとおりです。

@functions{
public bool ShouldShow(ModelMetadata metadata)
{
    //return number % 2 == 0 ? true : false;

    return metadata.ShowForDisplay
       && metadata.ModelType != typeof(System.Data.EntityState)
       && !metadata.IsComplexType
       && !ViewData.TemplateInfo.Visited(metadata);
}
}

@if (Model == null) {
@(ViewData.ModelMetadata.NullDisplayText)
} else if (ViewData.TemplateInfo.TemplateDepth > 1) {
@(ViewData.ModelMetadata.SimpleDisplayText)
} else {
foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => ShouldShow(pm))) {
    if (prop.HideSurroundingHtml) {
        @(Html.Display(prop.PropertyName))
    } else {
        if (!String.IsNullOrEmpty(prop.GetDisplayName())) {
            <div class="display-label">@(prop.GetDisplayName())</div>
        }
        <div class="display-field">@(Html.Display(prop.PropertyName))</div>
        }
    }
}

しかし、まだカテゴリが表示されていません。

4

1 に答える 1

2

うーん、私はあなたのようにすべてを作り、ここからテンプレートのコードを取得しました: http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html

HomeController.cs

public class HomeController : Controller
    {
        //
        // GET: /Home/
        public class Car
        {
            public int Id { get; set; }
            public string Colour { get; set; }
            public Category Category { get; set; }
        }

        public class Category
        {
            public int CatId { get; set; }
            public string Name { get; set; }
        }

        public ActionResult Index()
        {
            var car = new Car { Id = 1, Colour = "Black", Category = new Category { CatId = 2, Name = "Audi" } };

            return View(car);
        }
    }

インデックス.cshtml

@model MvcApplication1.Controllers.HomeController.Car

@{
    ViewBag.Title = "Car";
}

@Html.DisplayForModel()

ビュー/共有/DisplayTemplates/Object.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<% if (Model == null) { %>
    <%= ViewData.ModelMetadata.NullDisplayText %>
<% }
   else if (ViewData.TemplateInfo.TemplateDepth > 1) { %>
    <%= ViewData.ModelMetadata.SimpleDisplayText %>
<% }
   else { %>
    <% foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForDisplay
                         && !ViewData.TemplateInfo.Visited(pm))) { %>
        <% if (prop.HideSurroundingHtml) { %>
            <%= Html.Display(prop.PropertyName) %>
        <% }
           else { %>
            <% if (!String.IsNullOrEmpty(prop.GetDisplayName())) { %>
                <div class="display-label"><%= prop.GetDisplayName() %></div>
            <% } %>
            <div class="display-field"><%= Html.Display(prop.PropertyName) %></div>
        <% } %>
    <% } %>
<% } %>

そして、私はこの結果を持っています:

ここに画像の説明を入力

編集:

ちなみに、このコードを DisplayTemplate から削除すると、次のようになります。

if (ViewData.TemplateInfo.TemplateDepth > 1) { %>
    <%= ViewData.ModelMetadata.SimpleDisplayText %>
<% }

次の結果が表示されます。

ここに画像の説明を入力

これは、表示テンプレートがCategory Categoryプロパティの表示を開始したときTemplateDepthに 2 になり、完全なオブジェクトではなく ID プロパティのみが表示されるためです。

于 2013-07-09T10:28:54.947 に答える