如何解决MVC局部视图或编辑器模板:将索引附加到输入名称以供多种形式使用?
| 如何在一个视图中多次使用的表单中添加索引来输入名称和ID? 我为照片旋转器创建了一个表单,该表单提供了为每张照片(广告牌)编辑特定于上下文的标题的功能。我需要为此包含多个表单字段实例,以便管理员可以在一个视图中编辑旋转器照片集的所有标题,因此我需要一种方法来保持ID和字段名称唯一。 编辑器模板会自动添加前缀,但是当我遍历照片时,如下所示:<% foreach (var billboard in Model.Billboards ) { %>
<%: Html.EditorFor(x => billboard,\"BillboardForm\")%>
<% } %>
它只是将\“ billboard_ \”作为前缀添加,但这并不能解决我的问题。
我想将rotator id广告牌id附加到每个输入名称和id的末尾:
<form action=\"/Rotators/Edit/5\" method=\"post\">
<input id=\"billboard_21_RotatorId\" name=\"billboard_21_RotatorId\" type=\"hidden\" value=\"5\" />
<input id=\"billboard_21_ImageId\" name=\"billboard_21_ImageId\" type=\"hidden\" value=\"19\" />
<label for=\"billboard_21_Title\">Title</label>
<textarea cols=\"20\" id=\"billboard_21_Title\" name=\"billboard_21_Title\" rows=\"2\">Title</textarea>
<label for=\"billboard_21_Caption\">Caption</label>
<textarea cols=\"20\" id=\"billboard_21_Caption\" name=\"billboard_21_Caption\" rows=\"2\">This is the caption</textarea>
<select id=\"billboard_21_TopicId\" name=\"billboard_21_TopicId\">
<option value=\"1\">1st option</option>
</select>
</form>
任何简单的方法来做到这一点?
解决方法
请从史蒂夫·桑德森的博客文章中下载此示例代码。它与您的问题没有直接关系。但是在演示项目中,您会找到BeginCollectionItem html帮助器,该帮助器正在更改输入或一系列输入的前缀范围。这可以给你一个起点
编辑:
在您的编辑器模板中,您可以使用以下来自史蒂夫代码的方法,例如
using(Html.BeginHtmlFieldPrefixScope(\"BillBoard\" + Model.ID.ToString())){
<label>Image<label>
@Html.TextBoxFor(x=>x.Image)
<label>Caption</label>
@Html.TextBoxFor(x=>x.Caption)
}
如果ID是您模型的属性,并且具有例如4的值,那么您将拥有html之类的
<label>Image</label>
<input name = \"BillBoard4.Image\" .../>
<label>Caption</label>
<input name = \"BillBoard4.Caption\" .../>
,
注意:以下使用的功能可能在4年前不存在...
首先,您不必再使用beestings,而是使用@语法
在剃刀的例子中要干净得多。
您正在调用的方法在System.Web.Mvc.Html.EditorExtensions
中:
public static MvcHtmlString EditorFor<TModel,TValue>(
this HtmlHelper<TModel> html,Expression<Func<TModel,TValue>> expression
)
...
您的方法:
@foreach (var billboard in Model.Billboards ) {
@Html.EditorFor(x => billboard,\"BillboardForm\")
}
表达式x => billboard
的主体是ConstantExpression
。
这种方法导致在EditorTemplate中应用适当的范围:
@for (var i = 0; i < Model.BillBoards.Count(); i++)
{
@Html.EditorFor(x => Model.BillBoards[i],\"BillboardForm\")
}
如果Model.BillBoards
是一个数组,则表达式x => Model.BillBoards[i]
可描述为
SimpleBinaryExpression{NodeType:ArrayIndex}(
Left: ConstantExpression,Right: ConstantExpression
)
如果Model.BillBoards
是IList<T>
,则表达式x => Model.BillBoards[i]
可描述为
InstanceMethodCallExpressionN(
Method:RuntimeMethodInfo(IList<T>.get_Item (Int32 index)),Object:PropertyExpression(ConstantExpression),Arguments:[ConstantExpression]
)
接受表达式的“ 17”的重载会检查表达式主体的类型和NodeType并相应地构造范围。
如果循环中没有其他内容,则此代码应该等效:
@Html.EditorFor(x => Model.BillBoards,\"BillboardForm\")
如果只有只读视图和编辑视图,则可以重命名模板并删除第二个参数。假设BillBoard
是您的Model类,请将BillboardForm.cshtml
重命名为EditorTemplates/BillBoard.cshtml
,然后将代码更改为
@Html.EditorFor(x => Model.BillBoards)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。