0

我有一个 asp.net mvc3 C# 应用程序。它使用数据库。由于需求,数据库支持软删除方案。软删除方案不会级联。已标记为已删除的记录将显示为灰色。我的问题是如何做到这一点,而不必总是用一些 html 标记和样式围绕模型中的每个显示。

例如:

<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)

我不知道我应该如何处理这个问题,或者如果任何一种建议的方式是其他人处理这个问题的方式。您尝试过什么来显示软删除的项目?在某个地方有一个很好的教程吗?我真的找不到很多关于这个主题的材料。

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

4

3 回答 3

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));
}
于 2012-04-12T19:28:09.800 回答
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 元素,即可让所有内部元素具有不同的背景。

于 2012-04-12T19:29:32.330 回答
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/

于 2014-02-25T06:02:55.493 回答