ModelMetaData、自定义类属性和一个难以描述的问题
我想做的事情看起来很简单。
在我的index.cshtml中,我想显示WizardStepAttribute
值
因此,用户将在每个页面的顶部看到第1步:输入用户信息
我有一个名为的ViewModel WizardViewModel
。此 ViewModel 有一个属性 IList
每个“步骤”都实现接口 IStepViewModel,这是一个空接口。
我有一个名为 Index.cshtml 的视图。此视图显示 EditorFor()
当前步骤。
我有一个自定义 ModelBinder,它将视图绑定到基于 WizardViewModel.CurrentStepIndex
属性实现 IStepViewModel
的具体类的新实例
我创建了一个自定义属性 WizardStepAttribute
。
我的每个 Steps 类都是这样定义的。
[WizardStepAttribute(Name="Enter User Information")]
[Serializable]
public class Step1 : IStepViewModel
....
但我有几个问题。
我的视图是强类型化为 WizardViewModel
的,而不是每个步骤。我不想为 IStepViewModel
的每个具体实现创建一个视图,
我认为我可以向接口添加一个属性,但随后我必须在每个类中显式实现它。 (所以这并没有更好)
我想我可以使用接口中的反射来实现它,但是,您不能引用接口中方法中的实例。
What I want to do seems so simple.
In my index.cshtml I want to display the WizardStepAttribute
Value
So, a user will see at the top of each page, Step 1: Enter User Information
I have a ViewModel called WizardViewModel
. This ViewModel has a property that is IList<IStepViewModel> Steps
each "step" implements the Interface IStepViewModel, which is an empty interface.
I have a view called Index.cshtml. This view displays EditorFor()
the current step.
I have a custom ModelBinder, that binds the View to an new instance of the concrete class implementing IStepViewModel
based on the WizardViewModel.CurrentStepIndex
property
I have created a custom attribute WizardStepAttribute
.
Each of my Steps classes are defined like this.
[WizardStepAttribute(Name="Enter User Information")]
[Serializable]
public class Step1 : IStepViewModel
....
I have several problems though.
My View is strongly typed to WizardViewModel
not each step. I don't want to have to create a view for each concrete implementation of IStepViewModel
I thought I could add a property to the interface, but then I have to explicitly implement it in each class. (So this isn't any better)
I'm thinking I could implement it using reflection in the interface but, you can't refer to instances in methods in an interface.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是可以做到的,但既不容易,也不漂亮。
首先,我建议向您的 WizardStepAttribute 类添加第二个字符串属性 StepNumber,以便您的 WizardStepAttribute 类如下所示:
然后,必须修饰每个类:
接下来,您需要创建一个自定义 DataAnnotationsModelMetadataProvider,以获取您的 WizardStepAttribute 类的值自定义属性并将它们插入到 Step1 模型的元数据中:
然后,为了呈现您的自定义元数据,我建议创建一个自定义 HtmlHelper 来为每个视图创建标签:
如您所见,自定义帮助器创建一个 h3 标签与您的自定义元数据。
然后,最后,在您的视图中,输入以下内容:
两个注意事项:首先,在 Global.asax.cs 文件中,将以下内容添加到 Application_Start():
其次,在 Views 文件夹中的 web.config 中,确保为您的自定义 HtmlHelper 类添加命名空间:
瞧。
辅导员本
It can be done, but it is neither easy nor pretty.
First, I would suggest adding a second string property to your WizardStepAttribute class, StepNumber, so that your WizardStepAttribute class looks like this:
Then, each class must be decorated:
Next, you need to create a custom DataAnnotationsModelMetadataProvider, to take the values of your custom attribute and insert them into the Step1 model's metadata:
Then, to present your custom metadata, I suggest creating a custom HtmlHelper to create your label for each view:
As you can see, the custom helper creates an h3 tag with your custom metadata.
Then, finally, in your view, put in the following:
Two notes: first, in your Global.asax.cs file, add the following to Application_Start():
Second, in the web.config in the Views folder, make sure to add the namespace for your custom HtmlHelper class:
Voila.
counsellorben
在我们的例子中,我们只需要一个实现 IMetadataAware 接口的属性:
https://msdn.microsoft.com/en-us/library/system.web.mvc.imetadataaware(v=vs.118).aspx
在您的情况下,这可能是:
In our case we just needed an attribute that implements the
IMetadataAware
interface:https://msdn.microsoft.com/en-us/library/system.web.mvc.imetadataaware(v=vs.118).aspx
In your case, this could be: