Как заставить ASP.NET MVC 3 отображать объекты со сложными типами в автоматически сгенерированных представлениях? - PullRequest
0 голосов
/ 01 ноября 2011

У меня есть классы моделей, которые имеют в качестве свойств элементы сложных типов (т. Е. Другие классы моделей).Как сделать так, чтобы при автоматическом создании представлений из Visual Studio эти классы (включенные в класс верхнего уровня) отображались соответствующим образом?

В основном, как мне обновить http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.htmlв ASP.NET MVC 3?

TIA,
Benjy

Ответы [ 3 ]

4 голосов
/ 01 ноября 2011

Давай, приложи немного усилий и расскажи, с какими трудностями ты столкнулся!Иначе, как вы ожидаете чему-то научиться?

Views/Home/Index.cshtml:

@model SampleModel
<h3>Details</h3>
<fieldset style="padding: 1em; margin: 0; border: solid 1px #999;">
    @Html.DisplayForModel()
</fieldset>
<p>@Html.ActionLink("Edit", "Edit")</p>

Views/Home/Edit.cshtml:

@model SampleModel
<h3>Edit</h3>
@using (Html.BeginForm()) 
{
    <fieldset style="padding: 1em; margin: 0; border: solid 1px #999;">
        @Html.ValidationSummary("Broken stuff:")
        @Html.EditorForModel()
        <input type="submit" value="  Submit  " />
    </fieldset>
}
<p>@Html.ActionLink("Details", "Index")</p>

Views/Shared/DisplayTemplates/Object.cshtml:

@model object
@if (Model == null) 
{
    @ViewData.ModelMetadata.NullDisplayText
} 
else if (ViewData.TemplateInfo.TemplateDepth > 1) 
{
    @ViewData.ModelMetadata.SimpleDisplayText
} 
else 
{
    <table cellpadding="0" cellspacing="0" border="0">
    @foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm))) 
    {
        if (prop.HideSurroundingHtml) 
        {
            @Html.Display(prop.PropertyName)
        }
        else 
        {
            <tr>
                <td>
                    <div class="display-label" style="text-align: right;">
                        @prop.GetDisplayName()
                    </div>
                </td>
                <td>
                    <div class="display-field">
                        @Html.Display(prop.PropertyName)
                    </div>
                </td>
            </tr>
        }
    }
    </table>
}

Views/Shared/EditorTemplates/Object.cshtml:

@model object
@if (ViewData.TemplateInfo.TemplateDepth > 1) 
{
    @ViewData.ModelMetadata.SimpleDisplayText
} 
else 
{
    <table cellpadding="0" cellspacing="0" border="0">
    @foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm))) 
    {
        if (prop.HideSurroundingHtml) 
        {
            @Html.Editor(prop.PropertyName)
        } 
        else 
        {
            <tr>
                <td>
                    <div class="editor-label" style="text-align: right;">
                        @(prop.IsRequired ? "*" : "")
                        @Html.Label(prop.PropertyName)
                    </div>
                </td>
                <td>
                    <div class="editor-field">
                        @Html.Editor(prop.PropertyName)
                        @Html.ValidationMessage(prop.PropertyName, "*")
                    </div>
                </td>
            </tr>
        }
    }
    </table>
}
1 голос
/ 16 декабря 2011

Допустим, у вас есть модель представления со свойством, которое возвращает список объектов, таких как

public class Product
{
    public int ProductId { get; set; }
    public string Description { get; set; }
    public List<Detail> Details { get; set; }
}

, а затем вы хотите создать представление, использующее эту модель.Вот ваш метод действия

public ViewResult Edit(int productId)
{
   Product product = contextDB.Products.FirstOrDefault(p => p.ProductId == productId);

   return View("Edit", product);
}

Сгенерированный код будет выглядеть примерно так (неполно)

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>MyViewModel</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.ProductId)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ProductId)
            @Html.ValidationMessageFor(model => model.ProductId)
        </div>

    ...
    <fieldset>
}

Сгенерированный код по умолчанию НЕ будет содержать код для свойства List.Генератор кода движка представления Razor идет так же глубоко, как свойства модели.Вы можете написать код, который обращается к списку сведений в представлении, но это должен быть пользовательский код.

1 голос
/ 01 ноября 2011

Вы хотите обновить до синтаксиса бритвы?В противном случае он все равно должен работать в mvc 3. Просто поместите свой код в его примере в Views / Shared / EditorTemplates / Object.ascx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...