2017-02-21 7 views
-1

Я использую MVC 5 с рамкой сущности 6 У меня модель содержит обязательного свойствоDisabled Обязательные в MVC 5

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

    [NotMapped] 
    [ValidateFileAttributeForImages(ErrorMessageResourceName = "SliderFileError", ErrorMessageResourceType = typeof(GlobalRes))] 
    [Display(Name = "SliderFile", ResourceType = typeof(GlobalRes))] 
    public HttpPostedFileBase File { get; set; } 

    public string ImagePath { get; set; } 
} 

Мне нужно, чтобы удалить это требуется аннотации данных, так что я могу обновить или изменить эту модель так как я пользователь может загрузить изображение или нет в редактировании .. так что я нашел этот пост Disable Required validation attribute under certain circumstances

поэтому я сделал ViewModel, чтобы иметь те же свойства, но без необходимости.

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

     [NotMapped] 
    [Display(Name = "SliderFile", ResourceType = typeof(GlobalRes))] 
    public HttpPostedFileBase File { get; set; } 

    public string ImagePath { get; set; } 
} 

в моем результате действия

public ActionResult EditSliderLayer(SliderEditViewModel slider, string Comand, HttpPostedFileBase File) 
    { 
     using (DBContext db = new DBContext()) 
     { 
      if (ModelState.IsValid) 
      { 
       if (Comand == GlobalRes.EditBTN) 
       { 

        db.Entry(slider).State = EntityState.Modified; 
        db.SaveChanges(); <!-- here i got error --> 
        return View(); 
       } 
       else if (Comand == GlobalRes.DeleteBTN) 
       { 

       } 

      } 
      List<Slider> SliderName = db.Slider.ToList(); 
      ViewBag.SliderLayerName = new SelectList(SliderName, "id", "Header"); 
      return View(slider); 
     } 

    } 

Я получаю ошибку

Тип объекта SliderEditViewModel не является частью модели для текущего контекста.

ValidateFileAttributeForImages

public class ValidateFileAttributeForImages : RequiredAttribute 
{ 
    public override bool IsValid(object obj) 
    { 
     var file = obj as HttpPostedFileBase; 
     if (file == null) 
     { 
      return false; 
     } 
     if (file.ContentLength > 1 * 1024 * 1024) 
     { 
      return false; 
     } 
     try 
     { 
      if (Path.GetExtension(file.FileName) == ".png" || Path.GetExtension(file.FileName) == ".jpg" || 
       Path.GetExtension(file.FileName) == ".jpeg" || Path.GetExtension(file.FileName) == ".bmg ") 
      { 
       return true; 
      } 
     } 
     catch 
     { 

     } 
     return false; 
    } 
} 
+0

Вам необходимо сопоставить модель вашего просмотра с примером модели данных. А атрибут '[NotMapped]' в модели просмотра не имеет смысла (модели просмотра не связаны с EF в любом случае - [Что такое ViewModel в MVC?] (Http://stackoverflow.com/questions/11064316/what-is -viewmodel-в-MVC)). И как побочная заметка, вы неправильно указываете атрибут и предлагаете прочитать [этот ответ] (http://stackoverflow.com/questions/40199870/how-to-validate-file-type-of-httppostedfilebase-attribute-in- asp-net-mvc-4/40200034 # 40200034) –

ответ

0

Что вам нужно сделать, это приложить к модели DbContext:

db.Sliders.Attach(slider); 
db.Entry(slider).State = EntityState.Modified; 
db.SaveChanges(); 

Если предположить, что ваш DbSet для объекта Slider является ползунки.

Основываясь на комментариях, этого ответа, здесь дополнительная информация о наличии модели данных и модели домена.

У вас есть Slider модель, представляющая строки в таблице в базе данных и SliderEditViewModel, которые вы используете для формы на вашем представлении. Теперь, когда пользователь отправляет данные, вы получаете экземпляр SliderEditViewModel (переменная slider), но вашему DbContext нужен экземпляр Slider. Итак, действуйте следующим образом:

Slider dbSlider = new Slider(); 
dbSlider.Name = slider.Name; 
dbSlider.Whatever = slider.Whatever; 
.... 
db.Sliders.Attach(dbSlider); 
db.Entry(dbSlider).State = EntityState.Modified; 
db.SaveChanges(); 
+0

Я пробовал этот, но дал мне ошибку не может конвертировать из 'M.ViewModel.SliderEditViewModel' в 'M.Models.Slider' –

+0

Это означает, что вы используете другую модель базы данных и MVC, поэтому вам придется конвертировать из одного в другое. Создайте новый экземпляр свойств слайдера и копирования из экземпляра SliderEditViewModel. Затем присоедините, установите состояние для изменения и сохранения изменений. – Shadowed

+0

Мне жаль, что я смущен, вы можете мне помочь с примером. –

Смежные вопросы