2012-01-11 44 views
0

我有一个局部视图,有时需要收集数据,有时只需要显示保存的数据并且不允许编辑。创建一个包含元素,其属性可以影响子元素的呈现方式

我想为这两种需求使用相同的局部视图,因为格式很复杂。但是,我不想仅将“禁用”标记应用于特定控件:我希望(在服务器端)将只读数据呈现为文本而不是控件,以便它不能被回发。

(征求意见,使事情复杂化,有一个字段,可编辑,即使是只读的所有其他领域,所以会有一个回)。

我正在考虑这个问题的一般解决方案。做最简单的事情将是下面的代码模式适用于所有领域:

@{ if(condition) { 
    @Html.TextBoxFor(model=>model.Field) 
} 
else 
{ 
    @Html.DisplayFor(model=>model.Field) 
} 
} 

但是,这是不雅的,并可能导致难以阅读的代码。而且,由于模式必须手动应用,因此很容易出错。

我正在写一些扩展方法来补充TextBoxFor等,它将采用一个额外的参数来指示是否调用TextBoxFor或DisplayFor。

但我希望更好的是我可以设置一个包含的元素,它会自动影响子元素的呈现方式,您可以在ASP.NET WebForms Panel控件上设置Visible属性的方式。

所以现在我正在走进假设领域。为了实现这样的事情,我需要一个包含服务器端的元素(可能遵循与BeginForm相同的模式),它已经意识到它自己的范围,并且可能会影响包含渲染扩展调用的方式。

这样的事情甚至可能吗?

+3

为什么不只是创建两个单独的视图? – 2012-01-11 21:29:08

+0

@Shark因为视图足够复杂,格式足够复杂,所以我不想创建两件必须保持同步的东西。但是,谢谢你:一般来说这可能是最好的解决方案。 – 2012-01-13 16:30:19

回答

0

我不是真的推荐这一点,但你可以做这样的事情:

public static MvcHtmlString Ternary<TModel, TValue>(this HtmlHelper<TModel> html, bool test, Expression<Func<TModel, TValue>> expression, Func<Expression<Func<TModel, TValue>>, MvcHtmlString> truthy, Func<Expression<Func<TModel, TValue>>, MvcHtmlString> falsey) 
    { 
     return ((test) ? truthy : falsey).Invoke(expression); 
    } 

,然后用它是这样的:

@Html.Ternary(condition, x => x.Field, Html.TextBoxFor, Html.DisplayFor)); 

独立意见,像鲨鱼说,真的可能是正确的路要走。

+0

谢谢!这是一个有趣的方法! (但是我同意你的看法,更多的意见是独立的,但我发现保罗的回应,下面非常有趣。) – 2012-01-13 16:34:22

相关问题