2012-12-04 45 views
0

我有几个扩展类,从各个地方借用,而且它们都是单独工作的。当我尝试在同一页面上使用它们时,看起来不起作用。下面是设置:ASP.NET Html Extension没有解雇?

的页面名为.ascx代码看起来如:

<%@ Control Language="C#" AutoEventWireup="true" Inherits="System.Web.Mvc.ViewUserControl<PB.WMATA.ApplicationServices.ViewModels.Files.CIPDocumentAndFile>" %> 
<%@ Import Namespace="Company.Web.Extensions"%> 

<div class="editorRow"> 
    <% using(Html.BeginCollectionItem("docs")) { %> 

     <%= Html.Hidden("CIPDocument.Id", (Model != null) ? Model.Id : 0) %> 

     <label for="CIPNumber">Document Name:</label> 
     <%= Html.TextBox("CIPNumber", (Model != null) ? Model.CIPNumber : "", new { @size = "50", @maxlength = "255" })%> 
     <%= Html.ValidationMessage("CIPNumber")%> 
     &nbsp; 
     <% if (Model != null && Model.FileName != null && Model.FileName.Length > 0) { %> 
      <label>Current File:</label> 
      <%= Model.FileName %> 
     <% } else { %> 
      <label> 
       File Upload: 
        <%= Html.FileBoxFor(m => m.HttpPostedFileBase) %> 
      </label> 
     <% } %> 
     <a href="#" class="deleteRow">delete</a> 
    <% } %> 
</div>  

此厕所的输出ks如:

<div class="editorRow"> 
<input name="docs.index" autocomplete="off" value="1809201d-2143-4da3-ba34-e443a332c516" type="hidden"> 
<input id="docs_1809201d-2143-4da3-ba34-e443a332c516__CIPDocument_Id" name="docs[1809201d-2143-4da3-ba34-e443a332c516].CIPDocument.Id" value="0" type="hidden"> 
<label for="CIPNumber"> 
Document Name: 
</label> 
<input id="docs_1809201d-2143-4da3-ba34-e443a332c516__CIPNumber" maxlength="255" name="docs[1809201d-2143-4da3-ba34-e443a332c516].CIPNumber" size="50" value="" type="text"> 
&nbsp; 
<label> 
File Upload: 
<input id="HttpPostedFileBase" name="HttpPostedFileBase" type="file"> 
</label> 
<a href="#" class="deleteRow"> 
delete 
</a> 
</div> 

注意FileUpload控件没有得到HtmlPrefixScope。我预计它是:

<input id="docs_1809201d-2143-4da3-ba34-e443a332c516__HttpPostedFileBase" name="docs[1809201d-2143-4da3-ba34-e443a332c516].HttpPostedFileBase" type="file"> 

我不够精明的扩展看看会发生什么。我怀疑收集扩展正在处理之前,它试图处理文件扩展名。有任何想法吗?

回答

0

深入挖掘后发现我需要在Html.BeginCollectionItem(“docs”)调用改变它时获取TemplateInfo.HtmlFieldPrefix值。一旦我理解了TemplateInfo对象的生命周期,这真的很简单。以下是FileBox & FileBox代码段的更改代码:

public static MvcHtmlString FileBox(this HtmlHelper htmlHelper, string name, IDictionary<String, Object> htmlAttributes) 
{ 
    // If the HtmlFieldPrefix has been altered (see HtmlPrefixScopeExtensions class!!) then this will work with it... 
    var htmlFieldPrefix = htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix; 
    name = (!string.IsNullOrEmpty(htmlFieldPrefix) ? string.Format("{0}.", htmlFieldPrefix) : "") + name; 


    var tagBuilder = new TagBuilder("input"); 
    tagBuilder.MergeAttributes(htmlAttributes); 
    tagBuilder.MergeAttribute("type", "file", true); 
    tagBuilder.MergeAttribute("name", name, true); 
    tagBuilder.GenerateId(name); 


    ModelState modelState; 
    if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState)) 
    { 
     if (modelState.Errors.Count > 0) 
     { 
      tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); 
     } 
    } 


    return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.SelfClosing)); 
}