复杂属性剑道数据源
问题描述:
考虑以下复杂属性剑道数据源
模型
public partial class ElementType
{
public long ElementTypeId { get; set; }
public LocalizedString TypeName { get; set; }
}
[ComplexType]
public class LocalizedString
{
public string French { get; set; }
public string English { get; set; }
[NotMapped]
public string Current
{
get { return (string) LanguageProperty().GetValue(this,null); }
set { LanguageProperty().SetValue(this, value,null); }
}
public override string ToString()
{
return Current;
}
private PropertyInfo LanguageProperty()
{
string currentLanguage = Thread.CurrentThread.CurrentUICulture.DisplayName;
return GetType().GetProperty(currentLanguage);
}
}
控制器
public ActionResult ElementType_Read([DataSourceRequest]DataSourceRequest request)
{
List<ElementType> elementTypeList = db.ElementType.ToList();
IQueryable<ElementType> elementTypes = elementTypeList.AsQueryable();
DataSourceResult result = elementTypes.ToDataSourceResult(request, elementType => new
{
ElementTypeId = elementType.ElementTypeId,
TypeName = elementType.TypeName,
});
return Json(result);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ElementType_Destroy([DataSourceRequest]DataSourceRequest request, ElementType elementType)
{
if (ModelState.IsValid)
{
var currentElementType = db.ElementType.Find(elementType.ElementTypeId);
db.ElementType.Attach(currentElementType);
db.ElementType.Remove(currentElementType);
db.SaveChanges();
}
return Json(new[] { elementType }.ToDataSourceResult(request, ModelState));
}
读取动作按预期工作。我被TypeName.Current
越来越网格视图当前的TypeName但如果我尝试执行任何其他操作,如销毁或更新我得到这个例外无法将类型堇青石的”对象.Models.LocalizedString'键入'System.String'。
有没有解决它的建议?
问候
答
我建议你使用的DTO(数据传输对象),以平你的模型到更容易序列化/反序列化对象。您还将减少每个请求中客户端服务器之间传输的数据量。
为了您的具体实现,你可以定义一个DTO如下:
public class ElementTypeDTO
{
public long ElementTypeId { get; set; }
public string TypeName { get; set; }
}
根据你必须改变你的行为如下这种架构模式:
public ActionResult ElementType_Read([DataSourceRequest]DataSourceRequest request)
{
List<ElementType> elementTypeList = db.ElementType.ToList();
IQueryable<ElementType> elementTypes = elementTypeList.AsQueryable();
DataSourceResult result = elementTypes.ToDataSourceResult(request, elementType => new ElementTypeDTO
{
ElementTypeId = elementType.ElementTypeId,
TypeName = elementType.TypeName.Current,
});
return Json(result);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ElementType_Destroy([DataSourceRequest]DataSourceRequest request, ElementTypeDTO elementType)
{
if (ModelState.IsValid)
{
var currentElementType = db.ElementType.Find(elementType.ElementTypeId);
db.ElementType.Attach(currentElementType);
db.ElementType.Remove(currentElementType);
db.SaveChanges();
}
return Json(new[] { elementType }.ToDataSourceResult(request, ModelState));
}
我看不出有任何理由使用DTO在这种情况下,特别是因为我可能需要该对象。此外,如果属性'TypeName'被设置为'string',我的代码就不会像我的DTO那样得到'TypeName.Current'。 –