接收不同视图模型的通用函数

时间:2013-06-06 05:15:21

标签: c# asp.net-mvc-2

我正在使用MVC 2.

我有5个视图模型,每个模型都有不同的消息属性,我需要从数据库填充。根据消息类型,属性名称不同。

在视图模型中,我有可用的类型,我需要为其提取消息。

如果类型是欢迎,那么我想拉3条欢迎消息。

我想编写一个我将从每个动作调用的泛型函数。然后,此泛型函数将查看正在传递的对象及其type属性,然后将填充此视图模型中指定的消息属性。 如何实现这一目标?从我的行动来看,我不想为每种消息类型调用单独的函数。

我正在尝试做以下事情:

public void GetMessage(object viewModel, bool isCheckMessages)
        {
            viewModel = (AnnualReportWelComeViewModel)viewModel;

        }

但是此实例中的viewModel不会选择AnnualReportWelComeViewModel中指定的属性。

我是直接思考这个问题,还是仅仅考虑复杂而不是需要它?

2 个答案:

答案 0 :(得分:1)

您的代码存在的问题是您在转换类型时重复使用相同的变量。您的viewModel类型为object,即使您尝试将其转换为其他类型,您仍会将其视为object。你应该尝试这些方法:

public void GetMessage(object viewModel, bool isCheckMessages)
{
  var reportMessage = viewModel as AnnualReportWelComeViewModel;
  if (reportMessage != null)
  {
    // viewModel passed was of type AnnualReportWelComeViewModel
  }
}

如果您希望此功能检查许多可能类型的viewModel,那么您可以执行以下操作:

public void GetMessage(object viewModel, bool isCheckMessages)
{
  if (viewModel is AnnualReportWelComeViewModel)
  {
     var reportMessage = viewModel as AnnualReportWelComeViewModel;
     // ...
  }
  else if (viewModel is MonthlyReportWelComeViewModel)
  {
     var reportMessage = viewModel as MonthlyReportWelComeViewModel;
     // ...
  }

}

答案 1 :(得分:0)

您应该创建接口IViewModelWithMessage并从中继承所有viewmodel。

public interface IViewModelWithMessage
{
    string Message { get; set; }
}

在视图模型中,您应该将继承的属性Message映射到此模型消息:

public class AnnualReportWelComeViewModel : IViewModelWithMessage
{
    public string ViewModelMessage { get; set; }
    ....
    string IViewModelWithMessage.Message {
        get { return ViewModelMessage; }
        set { ViewModelMessage = value; }
    }
}

使用interface的Message属性执行您想要的操作,此值将传递给其他属性。

public void GetMessage(IViewModelWithMessage viewModel, bool isCheckMessages)
{
    ...
    viewmodel.Message = ...
}