我有一个相当复杂的策略类,其中我显示了一个复选框列表,用户检查他们想要哪一个,然后通过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类列表。
显示此列表并获取值的最佳方法是什么?有没有比我提议的更好的方法?
答案 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
热潮。完成。