Шаблон редактора MVC 3 с динамическим раскрывающимся списком

Как сделать так, чтобы раскрывающийся список отображался как часть моего шаблона редактора?

Итак, у меня есть сущность «Пользователи» и сущность «Роли». Роли передаются в представление как SelectList и User, а также как User. Список SelectList становится раскрывающимся списком с правильным выбранным идентификатором и всем благодаря этому образцу.

Я пытаюсь получить все-в-одном, красиво связанный EditorTemplate для моих сущностей с использованием MVC 3, чтобы я мог просто вызвать EditorForModel и красиво разложить поля с добавлением раскрывающегося списка всякий раз, когда у меня есть внешний ключ для таких вещей, как роли , в данном конкретном случае.

Мой EditorTemlates \ User.cshtml (динамическое создание макета на основе ViewData):

<table style="width: 100%;">
@{
    int i = 0;  
    int numOfColumns = 3;

    foreach (var prop in ViewData.ModelMetadata.Properties
        .Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm))) 
    { 
        if (prop.HideSurroundingHtml) 
        { 
            @Html.Display(prop.PropertyName) 
        }
        else 
        { 
            if (i % numOfColumns == 0)
            {

                @Html.Raw("<tr>");
            }

            <td class="editor-label">
                @Html.Label(prop.PropertyName)
            </td>
            <td class="editor-field">
                @Html.Editor(prop.PropertyName)
                <span class="error">@Html.ValidationMessage(prop.PropertyName,"*")</span>
            </td>

            if (i % numOfColumns == numOfColumns - 1)
            {
                @Html.Raw("</tr>");
            }
            i++;
        }
    }
}
</table>

Затем в представлении я привязываю SelectList отдельно, и я хочу сделать это как часть шаблона.

Моя модель:

public class SecurityEditModel
{
    [ScaffoldColumn(false)]
    public SelectList roleList { get; set; }

    public User currentUser { get; set; }
}

Мой контроллер:

public ViewResult Edit(int id)
{
    User user = repository.Users.FirstOrDefault(c => c.ID == id);

    var viewModel = new SecurityEditModel
        {
            currentUser = user,
            roleList = new SelectList(repository.Roles.Where(r => r.Enabled == true).ToList(), "ID", "RoleName")
        };

    return View(viewModel);
}

Мой взгляд:

@model Nina.WebUI.Models.SecurityEditModel

@{
    ViewBag.Title = "Edit";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Edit</h2>


@using(Html.BeginForm("Edit", "Security"))
{
    @Html.EditorFor(m => m.currentUser)
    <table style="width: 100%;">
        <tr>
            <td class="editor-label">
                User Role:
            </td>
            <td class="editor-field">
                <!-- I want to move this to the EditorTemplate -->
                @Html.DropDownListFor(model => model.currentUser.RoleID, Model.roleList)
            </td>
        </tr>
    </table>
    <div class="editor-row">
        <div class="editor-label">

        </div>
        <div class="editor-field">

        </div>
    </div>
    <div class="editor-row">&nbsp;</div>
    <div style="text-align: center;">
        <input type="submit" value="Save"/>&nbsp;&nbsp;
        <input type="button" value="Cancel" onclick="location.href='@Url.Action("List", "Clients")'"/>
    </div>

}       

Надеюсь, это достаточно ясно, дайте мне знать, если вы могли бы использовать дополнительные разъяснения. Заранее спасибо!


person Justin Moore    schedule 16.12.2011    source источник
comment
В основном, это не совсем то решение, которое я искал, но я считаю, что ответ Бена подойдет.   -  person Justin Moore    schedule 10.02.2012


Ответы (1)


Поскольку вам нужен доступ к SelectList, вы можете либо создать шаблон редактора, привязанный к SecurityEditModel, либо передать SelectList в ViewData. Лично я бы выбрал строго типизированный подход.

person Ben Foster    schedule 03.01.2012