基于语言从数据库查询数据的智能方法

时间:2015-09-01 10:07:48

标签: c# asp.net-mvc database database-design

我一直在开发支持阿拉伯语和英语的网络应用程序。目前我正在做这样的事情: [简化]

    @if (MyProject.Resources.Shared.SiteDirection == "ltr")
    {
        foreach (var Product in Model)
        {
            <b>@MyProject.Resources.Product.Index.ProductName</b> : <span>@Product.ProductName</span>
            <img src="@Product.ImagePath" />
        }
    }
    else if (MyProject.Resources.Shared.SiteDirection == "rtl")
    {
        foreach (var Product in Model)
        {
            <b>@MyProject.Resources.Product.Index.ProductName</b> : <span>@Product.ArabicProductName</span>
            <img src="@Product.ImagePath" />
        }
    }

显然,我有Product表,其中包含idProductNameArabicProductNameImagePath。我正在使用@MyProject.Resources.Shared.SiteDirection根据用户选择的语言为元素设置dir属性。

我要求一种更聪明的方法来设计数据库,查询数据 - 保持性能 - 比我现在正在做的那样,因为它确实得到 spaghetti-在实际项目中ous

1 个答案:

答案 0 :(得分:1)

它并不严格关于您的数据库问题,但例如您的视图可能如下所示:

foreach (var Product in Model)
    {
        <b>@MyProject.Resources.Product.Index.ProductName</b> : <span>@(MyProject.Resources.Shared.SiteDirection == "ltr" ? Product.ProductName : Product.ArabicProductName)</span>
        <img src="@Product.ImagePath" />
    }

我相信它更短更可靠。并且建议也不要使用魔术字符串等,例如&#34; ltr&#34; - 当然我知道它意味着什么,但是使用常数,当需要改变时,你必须只改变常数值而不是所有的出现。

但我仍然认为更好的方法是在ViewModel中只有ProductName,当你映射业务模型或实体时(取决于你有多少层),你必须选择ViewModel.ProductName = BusinessModel.ProductName还是BusinessModel .ArabicProductName

<强>更新

因此,根据您的评论,您的观点应如下所示:

foreach (var Product in Model)
    {
        <b>@MyProject.Resources.Product.Index.ProductName</b> : <span>@Product.Name</span>
        <img src="@Product.ImagePath" />
    }

Product.Name依赖于映射当前ProductNameArabicProductName,因此通常使用此逻辑(if / else)应移至应用程序的较低层并且视图应该只是绑定到需要的简单viewModel(当然在完美世界中)。