В случае, если кто-то еще придет в эту ветку в будущем с подобной проблемой, пожалуйста, посмотрите ниже.Пожалуйста, имейте в виду, что я не мог сделать это действительно общим, поскольку это разрешает очень специфическую ситуацию.Я создал подшивку модели, которая наследует подшивку модели по умолчанию.Это позволило мне использовать базовый метод BindModel, который сделал большую часть работы за меня (обычное отображение свойств из контекста, который MVC делает для нас).Затем я выбрал конкретное свойство, которое хотел заполнить, и извлек данные из сеанса.
public class SessionModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
try
{
var model = (EmailModel)base.BindModel(controllerContext, bindingContext);
model.FileStream = ExtractEmailFromSession(model.KendoUniqueId, HttpContext.Current.Session);
return model;
}
catch (Exception ex)
{
bindingContext.ModelState.AddModelError("","No data");
return null;
}
}
private byte[] ExtractEmailFromSession(string emailId, HttpSessionState session)
{
if (!string.IsNullOrEmpty(emailId))
{
var emailList = (List<EmailInSession>)session["emailInSession"];
return emailList?.FirstOrDefault(x => x.EmailUniqueId == emailId)?.File;
}
else return null;
}
}
Кроме того, необходимо зарегистрировать скоросшиватель новой модели.Это место, где вам нужно решить, к каким моделям применяется ваша модель переплета.
public class SessionModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(Type modelType)
{
if (modelType == typeof(EmailModel))
return new SessionModelBinder();
else return null;
}
}
Наконец, мне нужно было зарегистрировать моего нового поставщика подшивки, чтобы MVC знал об этом.Это делается путем добавления строки в глобальном asax (обратите внимание, что вам нужно поместить ее в цепочку на первой позиции - 0, в противном случае связыватель модели по умолчанию сработает, а ваша никогда не будет достигнута):
ModelBinderProviders.BinderProviders.Insert(0, new SessionModelBinderProvider());