Asp.Net MVC + NHibernate + Архитектура Плагинов Виджетов - PullRequest
0 голосов
/ 19 февраля 2010

Обновлен:

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

public ProfileWidgetViewModel MapFrom(ProfileWidget input, Account userAccount)
    {
        ProfileWidgetViewModel viewModel = Mapper.Map<ProfileWidget, ProfileWidgetViewModel>(input);

        viewModel.IsLoggedIn = identityTasks.IsSignedIn();

        // we need to use the correct mapper depending on the widget
        switch(input.GetType().Name.ToLower())
        {
            case "htmlwidget":
                viewModel.ProfileWidgetItem = htmlWidgetViewModelMapper.MapFrom((HtmlWidget)input);
                break;

            case "mediawidget":
                viewModel.ProfileWidgetItem = mediaWidgetViewModelMapper.MapFrom((MediaWidget)input, userAccount);
                break;
}

        return viewModel;
    }

Поскольку я передаю BaseClass (хотя я знаю, что могу безопасно уменьшить правильный тип), мне нужно сделать большой оператор switch для сопоставления модели представления Widget с использованием правильного класса.

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

1 Ответ

1 голос
/ 19 февраля 2010

Я рекомендую не использовать всплывающие окна, а использовать некоторые модальные окна для страницы, например jqModal . ИМО лучше для удобства использования, чем родные всплывающие окна.
О ваших виджетах, что вы думаете о проблеме со стороны моделей? Для виджета у вас будет 2 модели просмотра - одна для отображения и одна для редактирования настроек виджета. Лучше иметь 2 разных контроллера для отображения виджета и для редактирования настроек (здесь приведен принцип SRP ). Таким образом, первый контроллер вернет модель данных виджета, а второй - модель данных настроек. И просмотры, вы можете использовать столько, сколько вам нужно, здесь сложно что-то рекомендовать, используя только слова и без учета индивидуальной реализации проекта.
Трудно попытаться ответить на неопределенный вопрос. Может быть, вы должны задать более конкретные вопросы? И проверьте этот пример портала с виджетами, он использует библиотеку ExtJS, которую очень легко изучить и использовать, и она очень мощная.

Редактировать 20.02.10:
Я предпочитаю использовать следующий подход (например, я буду использовать виджет с именем FooWidget). Создайте 2 контроллера с именами FooWidgetDataController и FooWidgetSettingsController. Добавить маршруты для URL:

/widgets/FooWidget/data for FooWidgetDataController
/widgets/FooWidget/settings for FooWidgetSettingsController

Создать FooWidgetDataModel:

public class FooWidgetDataModel {
    public int Column1 {get; set;}
    public int Column2 {get; set;}
    public int Column3 {get; set;}
}

В FooWidgetDataController заполните FooWidgetDataModel и верните его в какое-либо представление:

public class FooWidgetDataController : Controller {
    public ActionResult Index(){
        var model = new FooWidgetDataModel{ Column1=5, Column2=1  }; // loading of data for FooWidgetDataModel
        return View(model); // using a view with name Index.ascx or Index.aspx
    }
}  

Создать FooWidgetSettingsModel:

public class FooWidgetSettingsModel {
    public bool ShowColumn1 {get; set;}
    public bool ShowColumn2 {get; set;}
    public bool ShowColumn3 {get; set;}
}

И пример кода для FooWidgetSettingsController:

// add some permission verification attribute here
public class FooWidgetSettingsController : Controller {
    [AcceptGet]
    public ActionResult Index(){
        var model = new FooWidgetSettingsModel{ ShowColumn1=true, ShowColumn2=false  }; // loading of data for FooWidgetSettingsModel
        return View(model); // using a view with name Index.ascx or Index.aspx
    }

    [AcceptPost, ActionName("Index")]
    public ActionResult IndexPost(FooWidgetSettingsModel model){ // model will be automatically binded by built it functionality
        // validate model
        // save settings if valid
        // and return whatever you want here
        return RedirectToAction("Index"); // for example, redirecting to edit page
    }
}

Используя этот подход, вам нужно будет создать контроллер для виджета. Возможно, вам это не понравится, но используя некоторые расширения или базовые классы, вам не нужно будет писать много кода. И код будет легко читать и просто.
Для отрисовки виджета на странице рассмотрите возможность использования Html.RenderAction (ранее это было в сборке mvc futures, сейчас я не отслеживаю изменения).
Обратите внимание: сохраняйте свои контроллеры как можно более тонкими и ознакомьтесь с рекомендациями для asp.net mvc ( ссылка 1 и ссылка 2 ).

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