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

掘り下げた後、Html.BeginCollectionItem( "docs")呼び出しによって変更されたため、TemplateInfo.HtmlFieldPrefix値を取得する必要があることがわかりました。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 に答える