从Controller到View的ViewModel类型架构

时间:2014-05-22 15:13:12

标签: asp.net asp.net-mvc asp.net-mvc-4

我有一个相当复杂的策略类,其中我显示了一个复选框列表,用户检查他们想要哪一个,然后通过ajax返回服务器。这堂课相当复杂:

public class Policy {
  public int PolicyId { get; set; }
  public string PolicyName { get; set; }

  ... another 15 properties ...
}

要显示复选框列表,我真的只需要Id和Name,所以我创建了一个简单的轻量级PolicyViewModel:

public class PolicyViewModel {
  public int PolicyId { get; set; }
  public string PolicyName { get; set; }
}

然后我将List传递给View并获取包含所选策略的List。

我团队的另一位开发人员表示,他并不一定要在Ajax调用中从ViewModel转换为Policy类来保存所选策略,但我拒绝发送策略列表由于他们发送到视图的重量,检索所有属性等等。

编辑:为了澄清,在Ajax保存方法上,为了持久保存到数据库,调用需要一个完整的Policy类列表。

显示此列表并获取值的最佳方法是什么?有没有比我提议的更好的方法?

2 个答案:

答案 0 :(得分:2)

我建议您不要在mvc应用程序中使用Domain对象。你必须只使用ViewModels,我认为这是mvc项目的最佳实践。看看Automapper并在项目中使用它,这将简化您的工作,所以这应该是这样的:

[HttpGet] 方法中,您将拥有:

var model =Mapper.Map<IList<Policy>,IList<VmSysPolicy>>(yourlist)

在您的 [HttpPost] 方法中,您将拥有:

var domainList=Mapper.Map<IList<VmSysPolicy>,IList<Policy>>(modelList);

在您的映射配置中,您将执行以下操作:

Mapper.CreateMap<Policy,PolicyVmSysPolicy,>()
.ForMemeber()//Your mapping here 

Mapper.CreateMap<VmSysPolicy,Policy>()
.ForMemeber//mapping here

答案 1 :(得分:2)

通常,在序列化为json时,您不需要单独的模型。只需从域对象中删除您需要的内容即可。

return policies.Select(x => new { PolicyId = x.PolicyId, Name = x.PolicyName}); 

在回程中,您不必发送任何超过用户选择的策略的ID。这些可以很容易地映射回您的策略对象。

public Whatever PostPolicyChoices(IEnumerable<int> ids)
{
    var checked = _context.Policies.Where(x => returnIds.Contains(x.PolicyId)); 
    // snip

热潮。完成。