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-
<%@ 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")%>
<% 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">
<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")%>
<% 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">
<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));
}