Я создал помощник HTML для файла (File и FileFor) следующим образом:HttpPostedFileBase всегда нуль при использовании пользовательских Html Helper
public static IHtmlString File(this HtmlHelper html, String text, String name, IDictionary<String, Object> attributes)
{
// Code snip
TagBuilder input = new TagBuilder("input");
input.MergeAttribute("type", "file");
input.MergeAttribute("name", name, true);
input.GenerateId(name);
return // ...
}
public static IHtmlString FileFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression, String text)
where TModel : class
{
return FileFor(html, expression, text, null);
}
Все отлично работает, если только у меня есть следующие модели:
public class AdvertViewNewModel : ViewModel
{
public AdvertModel Advert { get; set; }
public class AdvertModel
{
public HttpPostedFileBase Image { get; set; }
public String Name { get; set; }
}
}
проблема заключается в том, что в этом случае ASP.NET предоставляет входные данные как:
<input type="file" name="Advert.Image" id="Advert_Image">
И мой Html Helper делает это как:
<input type="file" name="Image" id="Image">
Что было бы нормально, если бы у меня не было дочернего класса.
Как я могу это решить?
UPDATE
Мой FileFor код:
public static IHtmlString FileFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression, String text, IDictionary<String, Object> attributes) where TModel : class {
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
String field = ExpressionHelper.GetExpressionText(expression);
String name = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(field);
return File(html, text, metadata.DisplayName ?? metadata.PropertyName ?? field, attributes == null ? new RouteValueDictionary() : attributes);
}
Пожалуйста, напишите, как 'FileFor' читает имя из' expression' – beautifulcoder
Да, я только что обновил его, чтобы включить этот код. В основном я использую: String name = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId (поле); –