2015-03-03 3 views
0

У меня есть модель CompanyInfoModel Она имеет такое поле:Как добавить свойство модели в контроллер mvc?

[Display(Name = "CompanyName", ResourceType = typeof(i18n))] 
[StringLength(64, ErrorMessageResourceType = typeof(i18n), ErrorMessageResourceName = "InvalidCompanyLength")] 
public string CompanyName { get; set; } 

В контроллере, в методе GET при определенных условиях я должен сделать свойство CompanyName требуемого (Это свойство не всегда требуется). Я не могу добавить требуемое свойство в виду из-за пользовательской реализации @Html.EditorFor.

Как добавить атрибут required к свойству в контроллере?

+0

Каковы обстоятельства, которые делают поле обязательным, так как это влияет на ответ? –

+0

Требуется ли «Требуется» на основе значения другого свойства вашей модели? –

ответ

2

Для условной проверки У вас есть несколько вариантов здесь

1) Создайте пользовательский обязательный атрибут, и реализовать логику, необходимую для включения требуемого поля вкл/выкл

public class CustomRequiredAttribute : RequiredAttribute 
{ 
    public override IsValid(object val, ValidationContext context) 
    { 
     if(SomeConditionisValid()) 
      return base.IsValid(val, context); 
     else 
      return true; // the field is valid (e.g not required) 
    } 
} 

Это может используется для управления проверкой, если правила могут быть получены из модели. Модель будет доступна от ValidationContext.ObjectInstance

2), вместо вышеизложенного можно реализовать IValidatableObject, который обеспечивает метод можно реализовать для выполнения правил проверки во время привязки модели. Опять же, если вы можете вывести правила проверки целиком из проверяемого объекта.

На вашей модели реализации IValidatableObject

IEnumerable<ValidationResult> Validate(
    ValidationContext validationContext 
    if(SomethingIsInvalid()) 
     yield return new ValidationResult("Something is invalid") { } 
) 

3) Если вам нужен контекст из внешней модели для выполнения проверки, делать проверку в пользовательской модели связующего, например, наследовать от DefaultModelBinder и переопределять

protected virtual bool OnPropertyValidating(
    ControllerContext controllerContext, 
    ModelBindingContext bindingContext, 
    PropertyDescriptor propertyDescriptor, 
    Object value 
) 
{ 
    if(SomethingIsInvalid()) 
    { 
     bindingContext.ModelState.AddModelError("Field", "Is Required"); 
    } 

    base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor) 
} 

Затем зарегистрировать модель связующего для типа

[ModelBinder(typeof(CompanyInfoModelBinder))] 
public class CompanyInfoModel 
{ 

} 

4) Есть ли в контроллере (не рекомендуется!)

+0

Спасибо за ответ. Я не использовал его, но я думаю, что это будет полезно для кого-то, так что вы примете его. –

0

Используйте вид модели:

public class CompanyInfoViewModel { 
    [Required] 
    public string CompanyName { get; set; } 
} 

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

0

я нашел другой способ сделать это с помощью JQuery. Я просто запустил

$("#CompanyName").prop('required',true); 

если мне это нужно.

+1

Не забывайте, что jqyery является клиентской стороной, и пользователь всегда может преодолеть этот тип проверки, и, таким образом, ваше имя_компании не проверяется ... Всегда проверяйте серверную сторону. – Gwasshoppa

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