复杂属性剑道数据源



考虑以下事项

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));
}

读取操作按预期工作。我正在网格视图中按类型名称获取当前类型名称。

但是,如果我尝试执行任何其他操作,例如销毁或更新,则会出现此异常无法将类型为"Iolite.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));
}

最新更新