asp.net mvc - построение представлений полностью из пользовательских полей в БД - PullRequest
4 голосов
/ 02 октября 2009

Я работаю над созданием веб-приложения asp.net mvc. Будут с полдюжины (может быть, еще больше) различных групп пользователей приложения, и все они будут работать с похожими, но подправленными пользовательскими интерфейсами, каждая с несколькими настраиваемыми полями, но все с использованием одних и тех же объектов.

Одной из идей создания пользовательского интерфейса является сохранение управляющей информации с каждым значением поля в базе данных и полное построение каждого представления при запросе базы данных.

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

Звучит так, как будто будет сложно управлять макетом.

Мой вопрос: это правильный подход? Где находится середина между созданием макета перетаскиванием и удалением всего пользовательского интерфейса из полей БД?

спасибо !!

Ответы [ 5 ]

2 голосов
/ 03 октября 2009

Лично я бы пошел на отдельно определенные представления. Конечно, я говорю это, не зная, насколько сложными будут отдельные взгляды. Мое обоснование в основном связано с работой макетов, что, как вы правильно сказали, будет сложнее при использовании созданных представлений.

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

1 голос
/ 08 октября 2009

Если вы можете использовать Preview 2 из MVC 2, вы можете сделать это, унаследовав DataAnnotationsModelMetadataProvider или ModelMetadata, если вам вообще не нужны вещи, основанные на атрибутах.

Тогда вы захотите переопределить метод CreateMetadata, например:

public class MyMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
    {
        ModelMetadata metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
        bool show = true;
        /* Code to check if the fields should show */

        metadata.ShowForDisplay = show;
        metadata.ShowForEdit = show;
        return metadata;
    }
}

Тогда в вашем общем виде просто вызовите .DisplayFor <> или .EditorFor <>, как показано здесь http://weblogs.asp.net/scottgu/archive/2009/07/31/asp-net-mvc-v2-preview-1-released.aspx.

Обновление:

Вам также необходимо установить ModelMetadataProviders.Current = new MyMetadataProvider();

1 голос
/ 02 октября 2009

Если ваши представления простые (плоские, без вложенных элементов управления), это может иметь смысл. MVC v2 поддерживает что-то подобное с Html.InputFor (), аналогичная вещь реализована для MVC v1 в InputBuilder из MvcContrib. Все они перебирают свойства модели с помощью отражения и создают соответствующие элементы управления (например, текстовое поле для строки, флажок для логического значения и т. Д.).

Однако я бы сказал, что для более полных просмотров это не удастся. Например, в настоящее время у MVC v2 есть проблемы с этим InputFor для IList. Но если вы можете взять идею (и источники MVC доступны, а также источники InputBuilder) и настроить ее по мере необходимости для вашего проекта. Я думаю, что только вы можете решить, может ли автоматизированная генерация работать на вас.

0 голосов
/ 09 октября 2009

Обычно я склоняюсь к отдельным взглядам, но в этой ситуации я думаю, что один взгляд может быть проще Я бы сделал это примерно так:

public class YourClass
{
    public string Property1 { get; set; }

    public int Property2 { get; set; }

    public DateTime Property3 { get; set; }
}

// ViewData for YourClass
public class YourClassViewData
{
    public YourClass YourClass { get; set; }

    public bool Property1Visible { get; set; }

    public bool Property2Visible { get; set; }

    public bool Property3Visible { get; set; }
}

// Use this inside your controller to
// build appropriate View data based on group or user
public classYourClassViewDataBuilder
{
    // not sure on what your using for user stuff but you can
    // change that. You should get the idea though...
    public static YourClassViewData BuildYourClassViewData(string user, YourClass yourClass)
    {
        YourClassViewData result = new YourClassViewData();
        result.YourClass = yourClass;

        if (user == "ViewOnly")
        {
            result.Property1Visible == false;
            result.Property2Visible == true;
            // etc.
        }
        else if (user == "Admin")
        {
            reslut.Poperty1Visible == true;
            // etc.
        }

        return result;
    }
}

// Then inside your view your would just do it like this...
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<YourClassViewData>" %>

<% if (Model.Property1Visible)
{ %>
    <label for="Property1">
    Property1:</label>
    <% Html.RenderYourControl("Property1", Model.YourClass.Property1) %>
<% } %>

<!-- continue for each property... -->
0 голосов
/ 07 октября 2009

MVC уделяет гораздо больше внимания семантическому HTML-коду, а HTML создан для потоковых макетов. Правильно спроектированные и стилизованные элементы управления не должны создавать проблем, особенно при проектировании на основе данных.

Например, посмотрите на этот сайт, основным содержанием является любое количество ответов на вопрос (с комментариями и без), сам вопрос, реклама, кнопки и т. Д.

Также рассмотрите такие сайты, как iGoogle, которые позволяют динамически размещать страницу (на самом деле вы меняете порядок и контейнеры элементов в макете потока).

Future Drag and Drop и другие конфетки Eye могут быть реализованы с помощью CSS, JavaScript и JQuery или других инфраструктур Web2.0 / Ajax UI / UX.

Проще говоря, ASP.net MVC был разработан для удовлетворения такого рода потребностей; динамические веб-приложения, управляемые данными, которые не получают преимущества от репликации WinForms в Интернете.

...