MVC - Custom Model Binding'e İlişkin Sorular
-
Merhaba hocalar,
Bir modelim var bunun içinde resim upload etmek için de bir property var. Bu property'e yönelik bi model binder yazdım.
Modelim:
namespace Blog.Models { public class YaziModels:IModelBinder { public int YaziID { get; set; } public DateTime Tarih { get; set; } public SelectList Kategoriler { get; set; } [Required(ErrorMessage = "Kategori seçilmelidir.")] public int SelectedId { get; set; } [Required(ErrorMessage = "Başlık boş bırakılamaz.")] [Column(TypeName = "nvarchar")] [MaxLength] public string Baslik { get; set; } [Required(ErrorMessage = "İçerik boş bırakılamaz")] [Column(TypeName = "ntext")] [MaxLength] public string Icerik { get; set; } public IList<string> KategoriStore { get; set; } public bool IsSucceed { get; set; } public string CKEditorMsg { get; set; } public IList<Yazi> yazi { get; set; } public int? Page { get; set; } public IPagedList<Yazi> yaziPaging { get; set; } public string SearchQuery { get; set; } public HttpPostedFileBase YaziResmi { get; set; } public string YaziResmiYolu { get; set; } public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { throw new NotImplementedException(); } } }Yazdığım Model Binder:
namespace Blog { public class FileUploadModelBinder:IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { HttpRequestBase request = controllerContext.HttpContext.Request; HttpPostedFileBase file = request.Files.Get("upload"); return new YaziModels { YaziResmi = file }; } } }ModelBinder'ı Global.asax'a
ModelBinders.Binders.Add(typeof(YaziModels), new FileUploadModelBinder());
Şeklinde ekledim. Bunu çalışıtırnca NotImplementedException hatası alıyordum sonra fark ettim ki bunun nedeni Modelime eklenen koddan dolayıymış onu da şu şekilde değiştirdim.
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { HttpRequestBase request = controllerContext.HttpContext.Request; HttpPostedFileBase file = request.Files.Get("upload"); return new YaziModels { YaziResmi = file }; }Şimdi soru(n)larıma gelirsek
1. Son haliyle çalıştırdığımda Modelden YaziResmi boş geliyor. Halbuki viewda yüklenecek dosyayı seçiyorum ve yolluyorum. Bunun haricinde benim yolladığım baslik , yazi gibi değerlerde boş dönüyor muhtemelen Model Binder da onlara ilişkin hiçbir şey yazmadığımdan.
2. DefaultModelBinder üstünden sadece YaziResmi için ekleme veya düzenleme yapmam mümkün müdür? Nasıl?
3. Aslında custom model binder daki amacım YaziResmi propertysinin boş dönmesi, bunu model binder da özelleştirmeye gitmeden halletmek mümkün müdür? YaziResmi'nin boş dönmesi tamamen benle mi alakalı, yoksa modelbinder yazmalı mıyım?
-
updulrahim
-
bi up daha çekelim..
-
Sorunu çözdüm.. Öncelikle tüm müridlere cevap vermedikleri için teşekkür ediyorum. Yanlış anlaşılmasın burda bi kinaye yok samimi bi teşekkür var :))
Şöyle ki dosya upload etmeye çalıştığımda controller'a hep null değer dönüyordu. Ben de bunun için custom model bindinge dek girmeye çalışmışım halbuki sorun <input type="file" /> tag'ının form etiketleri dışında olmasıymış.
Eğer birisi bu konuya cevap verseydi ve model bindingi yapabilseydim kod fazlalığından başka bir şey olmayacak ve hatta hala çözememiş olacaktım, bu yüzdendir ki teşekkür ediyorum.
