2012-03-07 3 views
7

Я использую ASP.NET MVC Razor и аннотации данных валидаторов Моя модель:Asp.net MVC 3 Validation исключить некоторые проверки поля в TryUpdateModel

public class Person 
{ 
    public int id { get; set; } 

    [Required] 
    public string FirstName { get; set; } 

    [Required] 
    public string LastName { get; set; } 
} 

FirstName и LastName являются Requerd. Я хочу изменить FirstName. Мой метод:

public ActionResult Edit([Bind(Include = "FirstName")]Person person) 
{ 
    var p = GetPerson(); 
    if (TryUpdateModel(p)) 
    { 
     //Save Changes; 
    } 
} 

Но TryUpdateModel всегда возвращает false. потому что LastName недействителен.

Как я могу предотвратить проверку проверки LastName в TryUpdateModel?

Примечание:

  • Код упрощен. мой реальный код очень сложный
  • Я должен использовать Requierd For Two собственности
  • Я не хотите использовать различные модели класса

ответ

17

Я нашел прекрасное решение. Я должен удалить неиспользуемое поле из ModelState. то ModelState.IsValid возвращает true. первый мне нужно создать новый класс атрибутов:

public class ValidateOnlyIncomingValuesAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var modelState = filterContext.Controller.ViewData.ModelState; 
     var valueProvider = filterContext.Controller.ValueProvider; 

     var keysWithNoIncomingValue = modelState.Keys.Where(x=>!valueProvider.ContainsPrefix(x)); 
     foreach (var key in keysWithNoIncomingValue) 
      modelState[key].Errors.Clear(); 
    } 
} 

я Добавить атрибут на мой Methode:

[ValidateOnlyIncomingValuesAttribute] 
public ActionResult Edit([Bind(Include = "FirstName")]Person person) 
{ 
    var p = GetPerson(); 
    if (ModelState.IsValid) 
    { 
     TryUpdateModel(p); 
     //Save Changes; 
    } 
} 

Посмотрите на это: http://blog.stevensanderson.com/2010/02/19/partial-validation-in-aspnet-mvc-2/

4

Короткий ответ: Вы не можете, не используя Аннотации данных по умолчанию.

Долгосрочный ответ: у вас есть несколько вариантов.

  1. Вы можете создать свои аннотации для валидатора.
  2. Вы можете сделать свой класс класса наследованием от ivalidatableObject, а затем реализовать метод Validate. (однако это не проверка на стороне клиента).
  3. Вы можете использовать стороннюю библиотеку проверки, например FluentValidation.
  4. Для этого сценария вы можете создать другую модель.
  5. Вы можете удалить проверку и просто добавить код к вашему методу действий, который проверяет правильность полей. (это не рекомендуется, так как это увеличивает сложность действия вашего контроллера, и вам нужно дублировать эту функциональность везде, где вы используете эту модель).
+0

вы убедитесь FluentValidation решить проблему? Могу ли я использовать FluentValidation с EF? – Morteza

+0

@MortezaTavakoli - Я не понимаю, что вы имеете в виду. Ваш вопрос касался MVC не EF. Ваша модель EF должна отличаться от модели модели. –

+0

EF не имеет к этому никакого отношения.Неважно, если это модель EF или другая модель. – RickAndMSFT

7

Очень простое решение, которое я понял.

public ActionResult Edit(Person person) 
{ 
    ModelState.Remove("FirstName"); // This will remove the key 
    var p = GetPerson(); 
    if (TryUpdateModel(p)) 
     { 
      //Save Changes; 
     } 
    } 
} 
13

Вы можете удалить свойства вам не нужно перед проверкой, если модель действует

ModelState.Remove("Email"); 
if (ModelState.IsValid) 
{ 
    // whatever you want to do 
} 
Смежные вопросы