Проверка на проблему DropDownListFor (ModelState.IsValid всегда false) - PullRequest
0 голосов
/ 13 апреля 2011

У меня проблема с использованием проверки на DropDownListFor ...

Моя модель:

public class User 
{
    ...
    public virtual int Id{ get; set; }
    [Required(ErrorMessage = "Required.")]
    public virtual Role Role { get; set; }
}

public class Role 
{        
    public virtual int Id{ get; set; }
    [Required(ErrorMessage = "Required.")]
    public virtual string Name { get; set; }
}

Мой контроллер:

    public ActionResult Edit()
    {
        ViewBag.Roles = new SelectList(new Repository<Role>().GetAll(), "Id", "Name");

        return View();
    }

Мое правление (строго набрано)

   @model User
   ...
   @Html.LabelFor(model => model.Role)
   @Html.DropDownListFor(model => model.Role.Id, ViewBag.Roles as SelectList, "-- Select --",new { @class = "form radius" })
   @Html.ValidationMessageFor(model => model.Role)

Все отлично работает, проблема возникает, когда я пытаюсь сохранить модель пользователя:

    [HttpPost]
    public ActionResult Edit(User user)
    {
        if (ModelState.IsValid)
        ...
    }

ModelState.IsValid всегда ложно ... Заглянув внутрь ModelState, ошибка находится в Role.Name ключ ... Ошибка: Поле Имя обязательно

Есть ли способ это исправить? Как?

Спасибо

Ответы [ 3 ]

5 голосов
/ 13 апреля 2011

Вы поместили обязательные атрибуты в свойство Name, но они никогда не отправляются на сервер, поэтому ваша модель недействительна (только Id POSTed).Поэтому вы должны поместить его в свойство Id:

public class Role 
{        
    [Required(ErrorMessage = "Required.")]
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

Также вы должны задать это свойство Id Nullable, так как вы определили пустое значение для раскрывающегося списка, а если пользователь этого не делаетвыберите любое значение, оно будет сбой.Итак, ваша модель должна выглядеть следующим образом:

public class Role 
{        
    [Required(ErrorMessage = "Required.")]
    public virtual int? Id { get; set; }
    public virtual string Name { get; set; }
}

Также вы можете удалить атрибут Required из свойства Role в классе User.Это не нужно.

Последний совет и, возможно, самый важный: замените это ViewBag уродство свойством на вашей модели представления, чтобы помощник выглядел следующим образом:

@Html.DropDownListFor(
    model => model.Role.Id, 
    Model.Roles, 
    "-- Select --",
    new { @class = "form radius" }
)
1 голос
/ 17 мая 2012

Я также сталкивался с такого рода ошибками.

Возможно, решением вашей проблемы является размещение кода, подобного этому, в вашем представлении Edit.cshtml:

@Html.HiddenFor (model =>model.Id)

0 голосов
/ 24 июня 2013

Модель

public class Role 
{        
    [Required(ErrorMessage = "Id Required.")]
    public virtual int Id { get; set; }
    [Required(ErrorMessage = "Name Required.")]
    public virtual string Name { get; set; }
}

View

@Html.DropDownListFor(m => m.Role.Id, (SelectList)ViewBag.gRoles, "-- Select --")
@Html.ValidationMessageFor(m => m.Role.Id)

Контроллер

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Creedit(User x)
{
    x.Role = db.RoseSet.Find(x.Role.Id);
    if (x.Role != null)
    {
        ModelState["Role.Name"].Errors.Clear();

    }

    if (ModelState.IsValid)
    {
      // proceed
    }
    else
    {
      // return validation error
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...