在Web API
JSON和XML媒体类型格式化程序(尤其是序列化程序)could be configured中使用[JsonIgnore]
或[DataMember]
装饰器。
它仅适用于方法字段,但基类怎么样?有没有办法忽略或包含它的某些字段?
如果没有 - 什么是控制可见性的最佳方法
序列化输出中的类字段?定义指定的JSON / XML序列化程序?使用Controller
中的选定字段将类对象转换为另一个类对象?
答案 0 :(得分:0)
您应该使用特定于当前操作的DTO,然后将数据从DTO复制到您要使用的实际对象。
这样做的好处是您可以定义特定于此操作的验证,并且您将没有业务对象的属性。您可以为每个新DTO的每个操作使用不同的验证规则,并仍然使用相同的业务对象。
如果您不想编写映射代码以从DTO映射到业务对象,则可以使用AutoMapper。
示例代码:
public enum ColourType
{
Flat,
Metallic
}
public class Car
{
public void Repaint(int red, int green, int blue, ColourType colourType)
{
// TODO: Add some validation logic and business logic.
}
}
public class RepainInMetallicModel
{
[Required]
[Range(0, 100)]
public int Red { get; set; }
[Required]
[Range(0, 100)]
public int Green { get; set; }
[Required]
[Range(0, 100)]
public int Blue { get; set; }
}
public class RepaintInFlatModel
{
[Required]
[Range(0, 255)]
public int Red { get; set; }
[Required]
[Range(0, 255)]
public int Green { get; set; }
[Required]
[Range(0, 255)]
public int Blue { get; set; }
}
public class CarController
{
public ActionResult RepaintInMetallic(RepainInMetallicModel model)
{
if (ModelState.IsValid)
{
var car = _carsRepository.Find(model.Id);
var.Repaint(model.Red, model.Green, model.Blue, ColourType.Metallic);
_carsRepository.Save(car);
}
return View();
}
public ActionResult RepaintInFlat(RepaintInFlatModel model)
{
if (ModelState.IsValid)
{
var car = _carsRepository.Find(model.Id);
var.Repaint(model.Red, model.Green, model.Blue, ColourType.Flat);
_carsRepository.Save(car);
}
return View();
}
}
以下示例未演示AutoMapper的用法,但它确实演示了DTO的用法。