выпадающий список всегда устанавливает недействительное состояние модели - PullRequest
0 голосов
/ 22 января 2011

Что с этим не так?

@Html.DropDownListFor(x => x.Post.CategoryId, new SelectList(Model.Categories, "ID", "CategoryName"), "-- Please select --")
@Html.ValidationMessageFor(x => x.Post.CategoryId)

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

(кстати, CategoryId - это FK в моей таблице сообщений) Я добавил этот класс "приятель" как частичный

[MetadataType(typeof(Post_Validation))]
public partial class Post
{

}

class Post_Validation
{

    [Required(ErrorMessage = "Please select a Category")]
    public int CategoryId { get; set; }

}

Контроллер:

// GET: /News/Add
        [Authorize]
        public ActionResult Add()
        {
            var model = new AddPostViewModel() { Categories = categoryRepository.GetAllCategories(), Post = new Post(), IsEditMode=false };
            return View(model);
        }


            //
            // POST: /News/Add
            [Authorize]
            [HttpPost]
            public ActionResult Add(AddPostViewModel model)
            {
              if (!ModelState.IsValid)
              {
              ..etc
              }
            }

Ответы [ 2 ]

2 голосов
/ 22 января 2011

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

[HttpPost]
public ActionResult Index(Post post) { ... }

вместо:

[HttpPost]
public ActionResult Index(ModelContainingPostConmtainingCategoryId post) { ... }

Имя сгенерированного выпадающего списка будет следующим: name="Post.CategoryId", и если ваше действие контроллера не использует модель со свойством Post со свойством CategoryId, и это свойство CategoryId помечается с Required вы получите поведение, которое вы описываете.

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


UPDATE:

Вот полный рабочий пример, который можно использовать в качестве базы:

Модель:

[MetadataType(typeof(Post_Validation))]
public class Post
{
    public int CategoryId { get; set; }
}

class Post_Validation
{
    [Required(ErrorMessage = "Please select a Category")]
    public int CategoryId { get; set; }
}

public class AddPostViewModel
{
    public IEnumerable<SelectListItem> Categories { get; set; }
    public Post Post { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new AddPostViewModel()
        {
            Categories = Enumerable.Range(1, 5).Select(x => new SelectListItem
            {
                Value = x.ToString(),
                Text = "category " + x
            }),
            Post = new Post()
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(AddPostViewModel model)
    {
        if (!ModelState.IsValid)
        {
            ...
        }
        ...
    }
}

Вид:

@model AppName.Models.AddPostViewModel
@{
    ViewBag.Title = "Home Page";
}
@using (Html.BeginForm())
{
    @Html.DropDownListFor(x => x.Post.CategoryId, new SelectList(Model.Categories, "Value", "Text"), "-- Please select --")
    @Html.ValidationMessageFor(x => x.Post.CategoryId)
    <input type="submit" value="OK" />
}
0 голосов
/ 06 января 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...