2015-01-24 2 views
0

У меня есть ORDERMetadata с 10 свойствами, но я хочу передать только модель с 5 свойствами в свой view1, но остальные 5 свойств для View2. Есть ли способ создать меньшие модели в ORDERMetadata, которые позволят мне только захватить свойства, которые я хочу, установив что-то в классе ORDERMetadata?MVC modelMetadata свойства расщепления для меньшего подмножества

Как я могу сделать это для своих просмотров?

@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 


    } 

ответ

1

Есть некоторые странные факты в этом всем деле ...

У меня есть ORDERMetadata с 10 свойствами, но я только хочу, чтобы пройти модель с только 5 свойствами для моего представления1, но остальные 5 свойств для View2. Есть ли способ создать более мелкие модели в ORDERMetadata, которые позволят мне только захватить свойства, которые я хочу, установив что-то в классе ORDERMetadata

Что? Во-первых, обычно вы будете отображать только один вид, верно? Итак, почему вы хотите разделить свой объект и сразу использовать 2 вида? Мне понадобится более подробное объяснение, чтобы понять вашу потребность.

Как я могу сделать это для своих просмотров?
@using MVC.models.OrderMetadata < View1Model?>
@using MVC.models.OrderMetadata < View2Model?>

No. Во-первых, я думаю, что вы пытаетесь сделать strongtyped View. Это правильная вещь, но вы делаете это неправильно. @using означает, что вы создаете псевдоним для пространства имен или импортируете типы, определенные в других пространствах имен. Для модели нет никакого отношения к модели.
Чтобы сделать Strongtyped View Your будет что-то вроде этого:
MyNamespace.ViewModels.MyViewModel
Важно помнить, что вы можете иметь только модель/ViewModel на вид, так что вы не можете (и даже не должны) использовать две ViewModels в одном представлении.

Кроме того, свойства с наименованием чисел являются чрезвычайно анти-шаблонами, поэтому, пожалуйста, не делайте этого. Если он каким-то образом используется динамически, вы должны создать коллекцию и перебрать ее.

О атрибуте 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 

Это просто царапина. Вы на самом деле не делаете ваши потребности ясными и не являетесь именно этими свойствами, но это несколько закономерность.

Также универсальный совет по программированию: вы действительно должны использовать самые семантические имена, которые вы можете себе представить для каждого вашего класса, свойств, пространств имен, атрибутов, ВСЁ! Затем, после того, как вы прочитаете имя своего свойства через некоторое время или в другом классе/представлении, вы точно знаете, для чего это нужно, и ему не нужно гадать/прокручивать «что, черт возьми, это свойство/класс/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

данных Anotattions (General> Display/DataType/Range/и т.д. ...):

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

данных Anotattions (Подтверждение):

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

+0

В вашем примере я могу добавить к нему данные, такие как [Обязательно], [Показать (Name = "")? – user1929393

+0

Несомненно! Они также привязываются к представлению и имеют автоматическую интеграцию с jQuery Validator. Также вы можете установить атрибут отображения и использовать Razor Helper 'Html.DisplayFor()', чтобы создать правильный html для вас. Это прелесть ViewModels. У них есть вся эта информация, организованная и лаконичная. Взгляните на введение в ViewModel. Существует много информации об использовании атрибута DataAnnotation для правильного указания поведения для ваших свойств. – Vitox

+0

ОК. Великий! Я не понимаю, почему мне понадобится ModelMetaData, потому что я просто использовал атрибуты нотации данных. – user1929393

Смежные вопросы