0

更新:

这是对我最初的问题(或缺少)的重写,我目前遇到的主要问题是,当将我的 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 视图模型。

我需要以某种方式使其更具动态性,以便它可以自动拾取要使用的正确类,我确信有一种方法可以使用泛型/反射来做到这一点,如果你认为我正在解决这个问题,我愿意接受建议错误道。

4

1 回答 1

1

我建议不要使用弹出窗口,而是在页面中使用一些模式窗口,比如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)。

于 2010-02-19T19:41:29.417 回答