Asp.net mvc 2 ASP.NET Html扩展未启动?

Asp.net mvc 2 ASP.NET Html扩展未启动?,asp.net-mvc-2,extension-methods,Asp.net Mvc 2,Extension Methods,我从不同的地方借了两个扩展课程,它们都单独工作。当我试图在同一页上同时使用这两个选项时,似乎有一个不起作用。以下是设置: MVC 2(没有升级到MVC 3或MVC 4的路径) HtmlPrefixScopeExtensions- FileBoxHtmlHelperExtension- .ascx页面代码如下所示: <%@ Control Language="C#" AutoEventWireup="true" Inherits="System.Web.Mvc.ViewUserCont

我从不同的地方借了两个扩展课程,它们都单独工作。当我试图在同一页上同时使用这两个选项时,似乎有一个不起作用。以下是设置:

  • MVC 2(没有升级到MVC 3或MVC 4的路径)
  • HtmlPrefixScopeExtensions-
  • FileBoxHtmlHelperExtension-
.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>

文件名称:
0) { %>
当前文件:
文件上载:
m、 HttpPostedFileBase)%%>
此文件的输出如下所示:

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


我对扩展不太了解,无法了解可能发生的情况。我怀疑集合扩展正在处理中,然后才尝试处理filebox扩展。有什么想法吗?

在深入研究之后,我发现我需要将TemplateInfo.HtmlFieldPrefix值作为Html.BeginCollectionItem(“文档”)获取调用改变了它。一旦我了解了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));
}
public static MvcHtmlString文件框(此HtmlHelper HtmlHelper、字符串名称、IDictionary htmlAttributes)
{
//如果HtmlFieldPrefix已被修改(请参阅HtmlPrefixScopeExtensions类!!),那么这将适用于它。。。
var htmlFieldPrefix=htmlHelper.ViewData.TemplateInfo.htmlFieldPrefix;
name=(!string.IsNullOrEmpty(htmlFieldPrefix)?string.Format(“{0}.”,htmlFieldPrefix):”“)+name;
var tagBuilder=新的tagBuilder(“输入”);
tagBuilder.MergeAttributes(HtmlatAttributes);
tagBuilder.MergeAttribute(“类型”、“文件”,true);
tagBuilder.MergeAttribute(“名称”,名称,true);
tagBuilder.GenerateId(名称);
模型状态模型状态;
if(htmlHelper.ViewData.ModelState.TryGetValue(名称,out ModelState))
{
如果(modelState.Errors.Count>0)
{
tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
}
}
返回MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.SelfClosing));
}