Я рекомендую не использовать всплывающие окна, а использовать некоторые модальные окна для страницы, например 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 ).