2015-07-18 4 views
2

Я часто обнаружил, что исправляю валидации для модели model вручную вручную из-за несогласованности некоторых полей, которые требуются в модели представления во время сообщение и получить.MVC ViewModel, используя виртуальную машину с определенными свойствами, отмеченными как обязательные, в зависимости от того, является ли ее GET или POST

Предположим, у меня есть этот вид Модель:

public class RestaurantMenuName_ViewModel 
{   
    public Int64 RestaurantMenuNameId { get; set; } 

    public Int64 OwnerId{ get; set; } 

    public string MenuNameCategory { get; set; } 

    public string CategoryDescription { get; set; } 

    public bool IsFormSaved { get; set; } 
} 

Во время запроса GET контроллер/действие требует проверку только на полях, RestaurantMenuNameId и OwnerId. При вызове ActionMenuName Action значение строки запроса - RestaurantMenuNameId и OwnerId. ModelState проверка будет осуществляться на:

  • RestaurantMenuNameId
  • OwnerId

Во время POST запроса контроллер/действие потребует ModelState проверки полей:

  • RestaurantMenuNameId
  • Уместно
  • MenuNameCategory
  • CategoryDescription

Это проблема несогласованности я говорю, решение может быть с помощью ViewModel для Get запросов и один за сообщение, но это может быть реальным расточитель времени и подвержен ошибкам , Использование ViewBag не обсуждается.

Вопрос: Есть ли способ сказать MVC, что мы хотим, чтобы некоторые поля [необходимы] для GET и других для POST?

Ниже приводится Псевдо-код, что я говорю о:

public class RestaurantMenuName_ViewModel 
{ 
    [Required: in GET, POST] //<--Pseudo code 
    public Int64 RestaurantMenuNameId { get; set; } 

    [Required: in GET, POST] //<--Pseudo code 
    public Int64 OwnerId { get; set; } 

    [Required: in POST]  //<--Pseudo code 
    public string MenuNameCategory { get; set; } 

    [Required: in POST]  //<--Pseudo code 
    public string CategoryDescription { get; set; } 

    public bool IsFormSaved { get; set; } 
} 
+4

Вы передаете сложные объекты методам GET? Если так, не делайте этого! Ваш параметр должен быть просто 'id' –

+0

@Stephen Muecke, да, я знаю, но есть некоторые особые случаи, когда передача сложного объекта в GET - это плохая практика, но более практичная. – Luther

+0

Почему вы хотите передать сложный объект в get, просто передайте требуемые идентификаторы – 3dd

ответ

2

Это не очень хорошая практика (и запутанной в вашем случае), чтобы передать сложные объекты, когда вам нужно только несколько свойств. Лучше передать только искомые идентификаторы в качестве примитивов.

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

Однако вы можете создать свой собственный атрибут validation, который будет проверять свойства, зависящие от текущего запроса.

public class MyRequiredAttribute : ValidationAttribute 
{ 
    private string httpVerb; 

    public MyRequiredAttribute(string httpVerb) 
    { 
     this.httpVerb = httpVerb; 
    } 

    public override bool IsValid(object value) 
    { 
     if(HttpContext.Current.Request.HttpMethod == this.httpVerb) 
     { 
      return value != null; 
     } 

     return true; 
    } 
} 

// Usage 
public class MyViewModel 
{ 
    [MyRequired("GET")] 
    public string A { get; set; } 

    [MyRequired("POST")] 
    public string B { get; set; } 
} 

Примечание: вы можете использовать перечисление, чтобы избежать некоторых трудностей (бывший верхний регистр, нижний регистр, и т.д.. Неправильное написание), а также вы можете переопределить метод FormatErrorMessage изменить сообщение об ошибке по умолчанию и отформатировать должным образом.

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

  • Нет связанных вопросов^_^