MVC modelMetadata 将属性拆分为更小的子集

MVC modelMetadata splitting properties to smaller subset

我有一个包含 10 个属性的 ORDERMetadata,但我只想将只有 5 个属性的模型传递给我的 view1,而将其余 5 个属性传递给 View2。有没有一种方法可以在 ORDERMetadata 中创建更小的模型,这样我就可以通过在 ORDERMetadata class 中设置一些东西来获取我想要的属性?

我可以这样做来表达我的观点吗?

@using MVC.models.OrderMetadata<View1Model?>

@using MVC.models.OrderMetadata<View2Model?>

我的OrderModel.cs

 [MetadataType(typeof(ORDERMetadata))]
    public partial class ORDER
    {
       // Note this class has nothing in it.  It's just here to add the class-level attribute.

    }

    public class ORDERMetadata
    {

        // <--- Model 1 Begin, for View1

        [Required]
        public int 1 { get; set; }

        [Display(Name = "")]
        public bool 2 { get; set; }

        [Display(Name = "")]
        public bool 3 { get; set; }

        [Display(Name = "")]
        public bool 4 { get; set; }

        [Display(Name = "")]
        public bool 5 { get; set; }

        // <--- Model 1 End


        //<---- Model 2, for View2

        [Display(Name = "")]
        public System.DateTime 6 { get; set; }

        [Display(Name = "")]
        public string 7 { get; set; }

        [Display(Name = "")]
        public string 8 { get; set; }        

        [Display(Name = "")]
        public string 9 { get; set; }        

        [Display(Name = "")]
        public string 10 { get; set; }  

        //<---- Model 2 end 


    }

这整件事中有一些奇怪的事实...

I have a ORDERMetadata with 10 properties, but I only want to pass a model with only 5 of the properties to my view1, but have the rest other 5 properties to View2. Is there a way to create smaller models within ORDERMetadata that will allow me to only grab the properties I want by setting something in ORDERMetadata class

什么?首先,通常你只会渲染一个视图,对吧?那么为什么要拆分对象并同时使用 2 个视图呢?我需要更详细的解释才能理解您的需求。

Like can I do this for my views?
@using MVC.models.OrderMetadata< View1Model?>
@using MVC.models.OrderMetadata< View2Model?>

没有。首先,我猜你正在尝试制作一个强类型的视图。这是正确的做法,但你做错了。 @using 表示您正在为命名空间创建别名或导入在其他命名空间中定义的类型。与您的视图模型无关。
要创建一个强类型视图,您应该是这样的:
MyNamespace.ViewModels.MyViewModel
请务必记住,每个视图只能有一个 Model/ViewModel,因此您不能(甚至不应该)在一个视图中使用两个 ViewModel。

此外,以数字命名的属性是一种非常反模式,所以请不要这样做。如果它以某种方式以动态方式使用,您应该创建一个集合并对其进行迭代。

关于 MetadataType 属性,它并不意味着像您正在做的那样使用。看一看:http://patrickdesjardins.com/blog/why-it-is-wrong-to-use-the-asp-net-mvc-metadatatype-attribute

现在,如何做这个结构:

C#:

public class OrdersVM
{
        public FirstDisplayVM FirstDisplay { get; set; }
        public SecondDisplayVM SecondDisplay { get; set; }


        public class FirstDisplayVM
        {
            public int Prop1 { get; set; }
            public List<bool> MyBooleanValues { get; set; }
        }

        public class SecondDisplayVM
        {
            public int Prop1 { get; set; }
            public List<string> MyStringValues { get; set; }
        }
}

查看:

@model YourNamespaceHere.ViewModels.OrderVM

那只是擦伤。您并没有真正明确您的需求,也没有明确说明此属性的用途,但在某种程度上是一种可遵循的模式。

还有一个通用的编程建议:您真的应该为每个 类、属性、名称空间、属性,一切都使用您能想象到的最符合语义的名称!然后,一旦您在一段时间后或在另一个 class/view 中阅读您的 属性 的名称,您就会确切地知道它的用途,并且不需要 guessing/riddling "what the hell is this property/class/etc..."。

如果您是 ASP.Net MVC 的新手,您应该在做任何事情之前尽可能多地了解 ViewModels。如果编程是梦想,那么在不知道正确的模式以及如何正确执行的情况下创建的结构将成为维护的噩梦。

ViewModel 介绍:

http://www.asp.net/mvc/overview/older-versions/mvc-music-store/mvc-music-store-part-3 http://sampathloku.blogspot.com.br/2012/10/how-to-use-viewmodel-with-aspnet-mvc.html http://nerddinnerbook.s3.amazonaws.com/Part6.htm

数据注释(常规 > 显示/数据类型/范围等...):

https://msdn.microsoft.com/en-us/library/dd901590%28v=vs.95%29.aspx

数据注释(验证):

https://msdn.microsoft.com/en-us/library/ee256141%28VS.100%29.aspx http://www.asp.net/mvc/overview/older-versions/mvc-music-store/mvc-music-store-part-6