Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 在MVC 3视图模型上使用可编辑属性_Asp.net Mvc 3_Attributes - Fatal编程技术网

Asp.net mvc 3 在MVC 3视图模型上使用可编辑属性

Asp.net mvc 3 在MVC 3视图模型上使用可编辑属性,asp.net-mvc-3,attributes,Asp.net Mvc 3,Attributes,我希望使用属性将视图模型属性标记为只读,以便视图字段在渲染视图中是只读的。应用System.ComponentModel.DataAnnotations.EditableAttribute似乎正是我需要的属性,但它似乎不起作用,即文本框字段仍然是可编辑的。我环顾四周,没有找到答案,只有几个相关的问题。渲染视图时,下面应用的可编辑属性不起作用 [Display(Name = "Last Name")] [Editable(false, AllowInitialValue = true)] publ

我希望使用属性将视图模型属性标记为只读,以便视图字段在渲染视图中是只读的。应用System.ComponentModel.DataAnnotations.EditableAttribute似乎正是我需要的属性,但它似乎不起作用,即文本框字段仍然是可编辑的。我环顾四周,没有找到答案,只有几个相关的问题。渲染视图时,下面应用的可编辑属性不起作用

[Display(Name = "Last Name")]
[Editable(false, AllowInitialValue = true)]
public string LastName { get; set; }
我可以使用这样的视图辅助函数实现只读行为,但我更喜欢在模型属性上使用属性

@functions {
    object getHtmlAttributes()
    {
    if (@ViewBag.Mode == "Edit")
    {
      return new {style = "width:100px;background:#ff6;", @readonly = "readonly"};
    }

    return new { style = "width:100px;" };  
}
} 

@Html.TextBoxFor(model => model.FirstName, getHtmlAttributes())

其他属性工作正常,包括自定义验证属性。您能告诉我data annotations editable属性是否在这种情况下工作,是否应该像上面应用的那样工作,或者是否需要执行其他操作?谢谢。

您有不同的创建场景吗?允许初始值的任何特殊原因?我这样问是因为报告说:

因为您通常希望两个属性包含相同的值, AllowInitialValue属性设置为 类构造函数


我在想,如果您将其设置为false,并且不显式声明
AllowInitialValue
,它将起作用。

我自己刚刚半解决了这个问题

[HiddenInput(DisplayValue=true)]


该字段显示但不可编辑。

不知道您是否已经解决了这个问题,但我们使用

System.ComponentModel.ReadOnlyAttribute
用法

[ReadOnly(true)]
各国:

数据字段上存在EditableAttribute属性表示用户是否应该能够更改字段的值


此类既不强制也不保证字段是可编辑的。无论是否存在此属性,底层数据存储都可能允许更改字段

不幸的是,这意味着使用该属性对MVC中的验证没有任何影响。这感觉是错误的,但如果您考虑在MVC框架中实现需要什么,这是有意义的。例如,在典型的“编辑”视图中,用户执行初始GET请求,在该请求中填充模型(通常来自DB记录),并将其提供给要呈现给用户的视图。然后用户进行一些编辑,然后提交表单。提交表单会导致根据POST参数构造模型的新实例。验证程序很难确保两个对象实例中的字段具有相同的值,因为其中一个实例(GET请求中的第一个实例)已经被释放

如果属性没有功能,为什么还要麻烦使用它呢?

我最好的猜测是,他们希望开发人员在代码中使用它来显示意图。更实际地说,您还可以编写自己的自定义代码来检查是否存在此属性

AttributeCollection attributes = TypeDescriptor.GetAttributes(MyProperty);
if (attributes[typeof(EditableAttribute)].AllowEdit)
{
   // editable
}
else
{
   // read-only
}

还要记住,这些DataAnnotation属性不仅适用于MVC应用程序,还可用于许多不同类型的应用程序。尽管MVC没有对该属性做任何特殊处理,.

发现在模型上使用Editable而不是Readonly的效果完全相同

[ReadOnly(true)] //or
[Editable(false)]
public string Name { get; set; }
当查询视图本身的属性属性时,此语法不起作用。属性可编辑时也适用(true)

此处使用编辑器模板创建一个简单的字符串模板:

@model String
@{
IDictionary<string, object> htmlAttributes = new Dictionary<string, object>();
if (ViewData.ModelMetadata.IsReadOnly) //this will be looking at the actual property not the complete model
{
htmlAttributes.Add("style", "width:100px; background-color:#ffffd6");
htmlAttributes.Add("readonly", "readonly");
@Html.TextBox("", Model, htmlAttributes)
}
@模型字符串
@{
IDictionary HtmlatAttributes=新字典();
if(ViewData.ModelMetadata.IsReadOnly)//这将查看实际属性,而不是完整的模型
{
添加(“样式”,“宽度:100px;背景色:#ffffd6”);
添加(“只读”、“只读”);
@文本框(“”,模型,htmlAttributes)
}

在“创建”视图中,我们希望用户能够为所有字段提供初始值,但一旦进入“编辑”视图,这些字段中的某些字段就需要成为只读。文档中说的是,AllowInitialValue将设置为与AllowEdit相同的值,除非您在属性声明中显式设置AllowInitialValue。是的hat试图说,如果将其保持为false,它应该会工作。当它设置为false时,它会工作吗?我现在看到您有两个场景,但只是好奇其中是否至少有一个可行。我最初使用editable属性时没有应用AllowInitialValue,并且AllowInitialValue显式设置为false。没有出现任何组合工作。这个类既不强制也不保证字段是可编辑的。这是我在发布问题时让我感到困惑的地方。你说得对,使用可编辑和只读属性只是指示性的,你必须寻找,然后相应地呈现你的视图。我最近在这个问题上花了一些时间,认为我没有很好。请参见下面的答案。@StevenChalk-很高兴看到您找到了解决方案!我在我的项目中已将一个类似的解决方案并入您的解决方案中。值得一提的是,
HiddenInputAttribute
位于
System.Mvc
命名空间中。如果您正在注释业务模型类而不是使用ViewModels,则不会影响您的工作使您的业务模型依赖于MVC框架是有意义的。另一方面,如果您使用带注释的ViewModels,则此属性将在不使用任何附加代码的情况下工作。这种方法的问题是只读在MVC中有一个定义的目的-它阻止绑定特定字段。它不是UI相关字段,而是模型绑定ng相关字段。通过在其中存储其他信息,您是在为一个单独的目的提供支持。仅我的.02:)这似乎不起作用,我总是在视图中得到
false
@model String
@{
IDictionary<string, object> htmlAttributes = new Dictionary<string, object>();
if (ViewData.ModelMetadata.IsReadOnly) //this will be looking at the actual property not the complete model
{
htmlAttributes.Add("style", "width:100px; background-color:#ffffd6");
htmlAttributes.Add("readonly", "readonly");
@Html.TextBox("", Model, htmlAttributes)
}