Я думаю, вы позволяете вашей модели тесно соединяться с вашим контроллером. Обычный способ сделать это:
public ActionResult AcceptFile(HttpPostedFileBase submittedFile) {
var bytes = submittedFile.FileContents;
var model = new DatabaseThing { data = bytes };
model.SaveToDatabase();
}
В этом случае вашей модели не нужно знать HttpPostedFileBase
, что является строго концепцией ASP.NET.
Если вам нужно сложное связывание, превышающее то, что предоставляет DefaultModelBinder
(что много), обычным способом является регистрация специализированных ModelBinder в Global.asax
и затем принятие ваших собственных классов Model в качестве аргументов метода действия, например: *
In Global.asax
:
ModelBinders.Binders.Add(typeof(MyThing), new ThingModelBinder());
Этот ModelBinder может, например, найти любой файл, который был опубликован с формой, и связать содержимое этого файла со свойством Data
вашего Thing
.
А в вашем контроллере:
public ActionResult AcceptThing(MyThing thing) {
thing.Data.SaveToDatabase();
}
В этом методе действий ваш ThingModelBinder
обработал бы все привязки, сделав его прозрачным как для контроллера, так и для модели.
В этом случае нет необходимости изменять ваши действительные классы Model, чтобы они знали и работали с ASP.NET. В конце концов, классы вашей модели должны представлять ваши фактические данные.