0

我有几个扩展类,从不同的地方借来的,它们都可以单独工作。当我尝试在同一页面上同时使用两者时,似乎其中一个不起作用。这是设置:

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

我对扩展不够精通,无法了解可能发生的情况。我怀疑在尝试处理文件箱扩展之前正在处理集合扩展。有任何想法吗?

4

1 回答 1

0

深入研究后发现我需要获取 TemplateInfo.HtmlFieldPrefix 值,因为 Html.BeginCollectionItem("docs") 调用已更改它。一旦我了解了 TemplateInfo 对象的生命周期,这真的很简单。这是 FileBox 和 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));
}
于 2012-12-05T17:29:39.937 回答