我有部分视图,有时需要收集数据,有时只需要显示已保存的数据而不允许编辑。
我想对两种需求使用相同的局部视图,因为格式很复杂。但是,我不想只将“禁用”标记应用于特定控件:我希望(在服务器端)将只读数据呈现为文本而不是控件,以便它不能回发
(更复杂的是,有一个字段用于评论,即使所有其他字段都是只读字段也可以编辑,因此会有回发。)
我正在考虑解决这个问题的一般方法。最简单的方法是将以下代码模式应用于所有字段:
@{ if(condition) {
@Html.TextBoxFor(model=>model.Field)
}
else
{
@Html.DisplayFor(model=>model.Field)
}
}
但这样做不够优雅,可能导致难以阅读代码。此外,由于必须手动应用模式,因此很容易出错。
我正在编写一些扩展方法来补充TextBoxFor等,这将需要一个额外的参数来指示是否调用TextBoxFor或DisplayFor。
但是我更喜欢的是我可以在包含元素上设置的内容,它会自动影响子元素的呈现方式,以及在ASP.NET WebForms Panel控件上设置Visible属性的方式。
所以现在我正在进入假设领域。为了实现这一点,我需要一个服务器端包含元素(可能遵循与BeginForm相同的模式),该元素具有自己的范围,并且可能影响调用它所包含的呈现扩展调用的方式。
这样的事情是否可能?
答案 0 :(得分:0)
我会看一下这篇文章:http://kazimanzurrashid.com/posts/asp-dot-net-mvc-viewmodel-usage-and-pick-your-best-pattern
它有一种方法可以从Views中删除逻辑,过程代码并促进更好的OOP和封装。您可能会发现它很有用,至少可以提供信息。
答案 1 :(得分: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));
像Shark所说的那样,单独的观点可能是正确的方法。