2014-10-08 2 views
0

Я создал помощник 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); 

} 
+1

Пожалуйста, напишите, как 'FileFor' читает имя из' expression' – beautifulcoder

+0

Да, я только что обновил его, чтобы включить этот код. В основном я использую: String name = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId (поле); –

ответ

0

Изменить

metadata.DisplayName ?? metadata.PropertyName ?? field 

Для

metadata.PropertyName 

Я думаю, что это подбирая DisplayName вместо PropertyName.

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