我建议不要使用弹出窗口,而是在页面中使用一些模式窗口,比如jqModal。IMO 它的可用性比原生弹出窗口更好。
关于你的小部件,从模型的角度来看问题呢?对于一个小部件,您将有 2 个视图模型 - 一个用于显示,一个用于编辑小部件的设置。最好有 2 个不同的控制器来显示小部件和编辑设置(我在这里使用SRP原则)。所以第一个控制器将返回一个小部件数据模型和第二个 - 设置数据模型。和视图,你可以根据需要使用,很难在这里仅使用文字来推荐一些东西,而不考虑项目的自定义实现。
很难回答一个模糊的问题。也许你应该问一些更具体的问题?并检查这个带有小部件的门户示例,它使用非常易于学习和使用且非常强大的 ExtJS 库。
编辑 02/20/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 期货程序集中,我目前不跟踪更改)。
请注意,保持控制器尽可能薄,并检查一些 asp.net mvc 的最佳实践(链接 1和链接 2)。