2011-01-27 122 views
4

我有我的看法文本框,下拉列表等所有这些的几个要素有这样的Asp.net MVC动态HTML属性

<%: Html.DropDownListFor(model => model.MyModel.MyType, EnumHelper.GetSelectList<MyType>(),new { @class = "someclass", @someattrt = "someattrt"})%> 

创造了一些独特的属性,我想创建一个只读版本的我通过设置另一个属性禁用。

有谁知道我该如何使用可以在全局范围内设置的变量来实现它?

喜欢的东西:

If(pageReadOnly){ 
isReadOnlyAttr = @disabled = "disabled"; 
}else 
{ 
isReadOnlyAttr =”” 
} 

<%: Html.DropDownListFor(model => model.MyModel.MyType, EnumHelper.GetSelectList<MyType>(),new { @class = "someclass", @someattrt = "someattrt",isReadOnlyAttr})%> 

我不想,如果你使用JavaScript来做到这一点

回答

5

我认为我已经做了类似于你的事情 - 基本上我有几个不同的用户该系统和一套在网站上拥有只读权限。为了做到这一点,我对每个视图模型中的变量:

public bool Readonly { get; set; } 

这取决于他们的角色权限设置在我的模型/业务逻辑层。

我然后创建一个扩展DropDownListFor HTML辅助接受boolean值,指示是否在下拉列表中只应阅读:

using System; 
using System.Collections.Generic; 
using System.Linq.Expressions; 
using System.Web.Mvc; 
using System.Web.Mvc.Html; 

public static class DropDownListForHelper 
{ 
    public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> dropdownItems, bool disabled) 
    { 
     object htmlAttributes = null; 

     if(disabled) 
     { 
      htmlAttributes = new {@disabled = "true"}; 
     } 

     return htmlHelper.DropDownListFor<TModel, TProperty>(expression, dropdownItems, htmlAttributes); 
    } 
} 

注意,您可以创建能够利用多个参数还包括其他实例。

比在我看来,我只是进口的命名空间为我的HTML辅助扩展名,然后在视图模型变量传递只读到DropDownListFor HTML辅助:

<%@ Import Namespace="MvcApplication1.Helpers.HtmlHelpers" %> 

<%= Html.DropDownListFor(model => model.MyDropDown, Model.MyDropDownSelectList, Model.Readonly)%> 

我为TextBoxFor,TextAreaFor和CheckBoxFor相同他们似乎都工作得很好。希望这可以帮助。

4

而不要禁用下拉列表,为什么不能取代它与所选择的选项...在这样做了很多的东西,你应该想想有一个只读视图和编辑视图...

<% if (Model.IsReadOnly) { %> 
    <%= Model.MyModel.MyType %> 
<% } else { %> 
    <%= Html.DropDownListFor(model => model.MyModel.MyType, EnumHelper.GetSelectList<MyType>(),new { @class = "someclass", someattrt = "someattrt"})%> 
<% } %> 

而且正如顺便说一句,你只需要转义“的属性名@ “如果它是保留字,比如”class“。

更新

好。我的确有一个答案 - 但条件是你在实施之前阅读这些内容。

MVC是关于分离问题。将逻辑放在控制器中,特别是该视图的关注点是滥用MVC。请不要这样做。任何特定于视图的东西,比如HTML,属性,布局 - 这些都不应该在“controllerville”中表现出来。控制器不应该改变,因为你想改变视图中的某些东西。

了解MVC试图实现的内容以及下面的示例会打破整个模式并将视图放在应用程序中的错误位置非常重要。

正确的修复方法是拥有“读取”视图和“编辑”视图 - 或者将任何条件逻辑放入视图中。但这是一种做你想做的事情的方式。 。:(

这个属性添加到模型

public IDictionary<string, object> Attributes { get; set; } 

在控制器,你可以有条件地设置属性:

model.Attributes = new Dictionary<string, object>(); 
model.Attributes.Add(@"class", "test"); 
if (isDisabled) { 
    model.Attributes.Add("disabled", "true"); 
} 

使用您的视图属性:

<%= Html.TextBoxFor(model => model.SomeValue, Model.Attributes)%> 
+0

这个视图有很多东西,我们只需要它就可以做某种“演示”。 我试图避免在每个元素上创建一个单独的视图或放置“if”语句。我宁愿从表单中删除提交按钮并添加禁用的属性。那可能吗 ? – Bart 2011-01-27 12:05:13

+0

我已经添加了一个这样的例子。只是因为这可能并不意味着你必须这样做...请阅读上面的例子。 – Fenton 2011-01-27 13:53:39