Проверка Asp.net MVC 3 исключает проверку некоторых полей в TryUpdateModel - PullRequest
7 голосов
/ 07 марта 2012

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

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

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

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

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

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

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

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

Примечание:

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

Ответы [ 4 ]

17 голосов
/ 08 марта 2012

Я нашел хорошее решение. Я должен удалить неиспользуемое поле из 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();
    }
}

затем я добавляю атрибут в мой метод:

[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/

14 голосов
/ 24 апреля 2013

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

ModelState.Remove("Email");
if (ModelState.IsValid)
{
   // whatever you want to do
}
7 голосов
/ 01 ноября 2012

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

public ActionResult Edit(Person person)
{
    ModelState.Remove("FirstName"); // This will remove the key 
    var p = GetPerson();
    if (TryUpdateModel(p))
       {
           //Save Changes;
       }
    }
}
4 голосов
/ 07 марта 2012

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

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

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