2016-12-06 7 views
0

В настоящее время я работаю над базовым приложением asp.net mvc. Сегодня я обнаружил странную проблему:ModelState недействителен, объект в порядке?

[HttpPost] 
[Authorize] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Create([Bind(Include = "Url, Homepage, Language, Country, Name")]FeedModel feedModel) 
    { 
     feedModel.Id = Guid.NewGuid().ToString();  
     feedModel.UserId = User.Identity.GetUserId(); 

     Debug.WriteLine(feedModel.UserId); 

     if (ModelState.IsValid) 
     { 
      db.Feeds.Add(feedModel); 
      await db.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 

     return View(feedModel); 
    } 

Видимо, ModelState.IsValid всегда ложно, согласно отладочных-инструментов в VS из-за величины USERID являющейся нулевым. Однако, используя Debug.WriteLine, файл feedModel.UserId отображается правильно.

Функция получения информации из представления, добавляя значения для Id и UserId.

Это feedModel-класс:

public class FeedModel 
{ 
    [Key] 
    public string Id { get; set; } 
    [Required] 
    public string UserId { get; set; } 
    [Required] 
    public string Url { get; set; } 
    [Required] 
    public string Homepage { get; set; } 
    [Required] 
    public string Language { get; set; } 
    [Required] 
    public string Country { get; set; } 
    [Required] 
    public string Name { get; set; } 
} 

Что я делаю неправильно с там?

Заранее благодарен!

+0

Вы повторили ошибки состояния модели, чтобы просмотреть, какие из них недействительны? – Fran

+1

Вам необходимо [переоценить модель] (http://stackoverflow.com/questions/6360087/manually-invoking-modelstate-validation) – Jasen

ответ

4

Вы только привязываете эти значения (Url, Homepage, Language, Country, Name) в Post, но ваша модель имеет Id и UserId, если требуется. Model.IsValid устанавливается во время привязки, которое выполняется до выполнения действия вашего контроллера. Просто потому, что вы установили Id и UserId в методе, это не изменяет тот факт, что модель недействительна.

+0

Хорошо, спасибо за быстрый ответ! Кажется, сейчас все работает нормально, что я удалил [required], но, вероятно, позже смогу использовать модель представления. –

3

ModelState устанавливается, когда происходит процесс привязки модели. В вашем случае заявление feedModel.UserId = User.Identity.GetUserId(); не изменит ModelState. Следовательно, проблема. Вы можете проверить правильность модели с помощью какого-то другого механизма, например, с помощью валидаторов. Если вы не хотите использовать другой механизм, вы можете установить значение по умолчанию для свойства UserId public string UserId { get; set; } = User.Identity.GetUserId(); или просто удалить атрибут Обязательный из свойства, чтобы он не отражался в ModelState.

+3

Проблема в том, что похоже, что он пытается использовать модель домена ef в качестве модели представления, поэтому он, вероятно, просто не может удалить атрибуты [Обязательные] из Id и UserId. Лучшим решением будет создание отдельной модели представления, которая содержит только то, что ему нужно от представления. – Fran