我一直在开发支持阿拉伯语和英语的网络应用程序。目前我正在做这样的事情: [简化]
@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
表,其中包含id
,ProductName
,ArabicProductName
,ImagePath
。我正在使用@MyProject.Resources.Shared.SiteDirection
根据用户选择的语言为元素设置dir
属性。
我要求一种更聪明的方法来设计数据库,查询数据 - 保持性能 - 比我现在正在做的那样,因为它确实得到 spaghetti-在实际项目中ous 。
答案 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
依赖于映射当前ProductName
或ArabicProductName
,因此通常使用此逻辑(if / else)应移至应用程序的较低层并且视图应该只是绑定到需要的简单viewModel(当然在完美世界中)。