我有一个asp.net mvc3 C#应用程序。它使用数据库。由于需求,数据库支持软删除方案。软删除方案不会级联。已标记为已删除的记录将显示为灰色。我的问题是如何做到这一点,而不必总是用模型和样式包围模型中的每个显示。
例如:
<span @if(m.Box.isDeleted){
<text>style="background-color:gray"</text>
}>@m.Box.Name @m.Box.Description</span>
我可以这样做,但是看看我必须对每个ViewModel对象显示做的所有额外标记。
我想做的是@ m.Box.Name.AddMarkup()或那种程度的东西。也许我可以制作一个帮助物品,然后返回正确的标记,例如
namespace place.Markup
public class Markup
{
public ModelItem(object o, property name)
{
//perhaps use reflection so the flag isnt passed all the time
//create markup with flag conditional decoration
//return markup
}
}
然后
@Markup.ModelItem(@m.Box.Description)
我不确定我应该如何处理这个问题,或者其他方法是否是其他人如何处理此问题。你有什么试图显示软删除的项目?这个地方有一个很好的教程吗?我真的找不到关于这个主题的很多材料。
请注意:过滤这些对象不是问题,故意显示它们,并且需要以反映软删除的方式显示它们。
答案 0 :(得分:2)
我会基于DisplayFor
的一个或多个重载创建一个htmlHelper像
这样的东西 public static MvcHtmlString DisplayDeleteCheckFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression, bool condition) {
var value = html.DisplayFor(expression).ToString();
var style=condition ? "style=\"background-color:gray\"" : string.Empty;
return MvcHtmlString.Create(
string.Format("<span {0}>{1}</span>", style, value));
}
答案 1 :(得分:1)
更简单的方法是利用CSS。这是一个非常粗略的例子。
<style>
.isDeleted .showGrayIfDeleted
{
background-color:gray;
}
</style>
在您的控制器中:
if (m.Box.isDeleted)
{
m.Box.listOfClasses.Add("isDeleted");
}
在您看来:
<div class="@string.Join(" " , m.Box.listOfClasses)">
<span>blah</span><br/>
<span class="showGrayIfDeleted">This will be gray if deleted.</span><br/>
<span class="showGrayIfDeleted">@m.Box.Name @m.Box.Description</span><br/>
</div>
通过利用CSS的级联效果,您只需要将一个类应用于容器html元素,以使所有内部元素具有不同的背景。
答案 2 :(得分:1)
我为此做的是拥有一个结构如下的CSS静态助手类:
public static class ProductCssHelper
{
public static string IsDeleted(bool IsDeleted)
{
return IsDeleted ? "deleted" : String.Empty
}
public static string IsAction(bool IsActiveAction)
{
return IsAction ? "active-action" : "inactive-action"
}
}
在剃刀中:
<table>
<thead>
<tr>
<td>Date</td>
<td>Name</td>
<td>Is Deleted</td>
<td>Active</td>
</tr>
</thead>
<tr>
<td>Today</td>
<td>Bottle</td>
<td class="@(ProductCssHelper.IsDeleted(Model.IsDeleted))">Yes</td>
<td class="@(ProductCssHelper.IsActive(Model.IsActiveAction))">No</td>
</tr>
</table>
不包括CSS定义,但这将返回定义的css类的字符串。
我喜欢这个方法,因为你可以制作一个CSSHelper文件夹,里面有你需要的控制器或视图/区域所需的辅助类,所以你可以把所有东西放在一个地方。
最初不是我的想法,但我找到了我得到这个想法的来源: http://www.arrangeactassert.com/asp-net-mvc-view-best-practices-keep-logic-out-of-your-views/