1

如何添加索引以在一个视图中多次使用的表单中输入名称和 ID?

我为照片旋转器创建了一个表单,它提供了为每张照片(广告牌)编辑特定于上下文的标题的能力。为此,我需要能够包含表单字段的多个实例,以便管理员可以在一个视图中编辑旋转器的一组照片的所有标题,因此我需要一种方法来保持 ID 和字段名称的唯一性。

编辑器模板会自动添加前缀,但是当我像这样遍历照片时:

<% foreach (var billboard in Model.Billboards ) {  %>
    <%: Html.EditorFor(x => billboard, "BillboardForm")%>
<% } %>

它只是添加了“billboard_”作为前缀,这并不能解决我的问题。

我想将rotator id billboard 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>

有什么简单的方法可以做到这一点??

4

2 回答 2

1

请从史蒂夫·桑德森的博客文章中下载此示例代码。它与您的问题没有直接关系。但在演示项目中,您会发现 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" .../>
于 2011-06-13T09:36:49.307 回答
0

注意:下面使用的功能可能在 4 年前不存在...首先,您不必再使用 beestings,Razor 示例中使用的 @ 语法要干净得多。

你调用的方法是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 => billboardConstantExpression.

这种方法导致在 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.BillBoardsIList<T>,则表达式x => Model.BillBoards[i]可以描述为

InstanceMethodCallExpressionN(
    Method:RuntimeMethodInfo(IList<T>.get_Item (Int32 index)),
    Object:PropertyExpression(ConstantExpression),
    Arguments:[ConstantExpression]
)

接受表达式的重载EditorFor()检查表达式主体的 Type 和 NodeType 并相应地构造范围。

如果循环中没有其他任何内容,则此代码应该是等效的:

@Html.EditorFor(x => Model.BillBoards, "BillboardForm")

如果您只有只读视图和编辑视图,则可以重命名模板并删除第二个参数。假设BillBoard是您的 Model 类,重命名BillboardForm.cshtmlEditorTemplates/BillBoard.cshtml,然后将代码更改为

@Html.EditorFor(x => Model.BillBoards)
于 2015-12-09T13:39:55.687 回答