我有一个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)我不确定我应该如何处理这个问题,或者是否建议的任何一种方法都是其他人处理这个问题的方式。您尝试过显示哪些软删除的项目?有没有关于这方面的好教程?我真的找不到太多关于这个话题的材料。
请注意:过滤这些对象不是问题,它们是故意显示的,它们需要以反映软删除的方式显示。
发布于 2012-04-13 03:28:10
我会基于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-13 03:29:32
更简单的方法是利用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元素,即可使所有内部元素具有不同的背景。
发布于 2014-02-25 14:02:55
我为此做的是有一个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/
https://stackoverflow.com/questions/10130169
复制相似问题