首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何才能更高效地完成@Model项目的装饰?

如何才能更高效地完成@Model项目的装饰?
EN

Stack Overflow用户
提问于 2012-04-13 03:11:43
回答 3查看 104关注 0票数 0

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

例如:

代码语言:javascript
复制
<span @if(m.Box.isDeleted){
 <text>style="background-color:gray"</text>
 }>@m.Box.Name @m.Box.Description</span>

我可以做到这一点,但看看我必须为每个ViewModel对象显示做的所有额外标记。

我想要做的是@m.Box.Name.AddMarkup()或某种程度上的东西。也许我可以做一个帮助器,它接受项目,然后返回正确的标记,比如

代码语言:javascript
复制
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
 }
}

然后

代码语言:javascript
复制
@Markup.ModelItem(@m.Box.Description)

我不确定我应该如何处理这个问题,或者是否建议的任何一种方法都是其他人处理这个问题的方式。您尝试过显示哪些软删除的项目?有没有关于这方面的好教程?我真的找不到太多关于这个话题的材料。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-13 03:28:10

我会基于DisplayFor的一个或多个重载创建一个htmlHelper

就像这样

代码语言:javascript
复制
 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));
}
票数 2
EN

Stack Overflow用户

发布于 2012-04-13 03:29:32

更简单的方法是利用CSS。这是一个非常粗略的例子。

代码语言:javascript
复制
<style>
.isDeleted .showGrayIfDeleted
{
  background-color:gray;
}
</style>

在您的控制器中:

代码语言:javascript
复制
if (m.Box.isDeleted)
{
  m.Box.listOfClasses.Add("isDeleted");
}

在您的视图中:

代码语言:javascript
复制
<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元素,即可使所有内部元素具有不同的背景。

票数 1
EN

Stack Overflow用户

发布于 2014-02-25 14:02:55

我为此做的是有一个CSS静态助手类,它的结构如下:

代码语言:javascript
复制
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"
    }
}

在剃刀里:

代码语言:javascript
复制
<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/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10130169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档