ASP.NET Html扩展无法解雇?

时间:2012-12-04 16:50:01

标签: asp.net-mvc-2 extension-methods

我有几个扩展课程,从不同的地方借来,他们都工作 - 个别。当我尝试在同一页面上使用它们时,它会显示一个不起作用。这是设置:

.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>     

此输出如下:

<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">

我不太精通扩展,看看可能会发生什么。我怀疑在尝试处理文件框扩展名之前正在处理集合扩展。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在深入研究之后我发现我需要获取TemplateInfo.HtmlFieldPrefix值,因为Html.BeginCollectionItem(“docs”)调用已经改变了它。一旦我理解了TemplateInfo对象的生命周期,这真的很简单。这是FileBox&amp;的改进代码。 FileBoxFor代码片段:

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));
}