如何更有效地完成装饰@Model项目?

时间:2012-04-12 19:11:43

标签: c# asp.net-mvc-3 razor

我有一个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)

我不确定我应该如何处理这个问题,或者其他方法是否是其他人如何处理此问题。你有什么试图显示软删除的项目?这个地方有一个很好的教程吗?我真的找不到关于这个主题的很多材料。

请注意:过滤这些对象不是问题,故意显示它们,并且需要以反映软删除的方式显示它们。

3 个答案:

答案 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/