2017-08-03 57 views
0

考虑以下复杂属性剑道数据源

模型

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'。

有没有解决它的建议?

问候

回答

0

我建议你使用的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)); 
} 
+0

我看不出有任何理由使用DTO在这种情况下,特别是因为我可能需要该对象。此外,如果属性'TypeName'被设置为'string',我的代码就不会像我的DTO那样得到'TypeName.Current'。 –