0

我有一个 MVC 应用程序。有些元素相当复杂,所以我为它们创建了一个模板。我用他们打电话@Html.EditorFor()。问题是我需要动态创建此类元素的可能性,我的意思是在单击“新建”按钮后,我想生成一个空模板并让用户填写它。我可以像这样使用 mustache 模板引擎或 smth,但在这种情况下,我需要复制我的 html - 在 razor 模板和 html 中。我不想重复自己,实现这一目标的最佳方法是什么?

另一个问题是,当我为 IEnumerable<> 生成视图时 - razor 为具有适当索引的元素创建了适当的名称。如果我想创建新元素 - 我应该如何设置这些索引以让 binder 在 POST 上正常工作?有没有比使用 jQuery 更好的解决方案?

提前谢谢。

更新:

这是一个编辑器模板:

@model FakeViewModel
<li>
    <div>
        <h3><span>@Model.Title</span><span class="icon-remove"></span><span class="icon-move"></span></h3>
        <div>
            @Html.HiddenFor(m => m.Id)
            @Html.HiddenFor(mp => mp.Category)
            <div>
                <span class="font-small">Title</span>
            </div>
            <div>@Html.TextBoxFor(m => m.Title, new { @maxlength = FakeViewModel.MaxTitleLength, @class = "title-textbox" })</div>
            <div>
                @Html.TextAreaFor(m => m.Description, new { @placeholder = "short description", @data_max_length = "90" })
            </div>
        </div>
    </div>
</li>

这就是我渲染它的方式,“特殊”是一种IEnumerable<FakeViewModel>

<ul class="container" id="special">
    @Html.EditorFor(m => m.Special)
</ul>

所以,在渲染这个之后,我得到了一个名称正确的布局,我的意思是Special[0].Id,Speacial[0].Category等等。

现在,我想创建一个空模板。现在我使用 mustache 模板,它应该具有与编辑器模板相同的布局:

<script type="text/template">
    <input name="Special[{{itemIndex}}].Category"
</script>

问题是,我在两个不同的地方使用相同的布局——在胡子模板和剃刀编辑器模板中。如果我需要更改此布局 - 我需要在两个地方进行更改。我想避免这种情况。另一个问题是我需要硬编码名称(本例中为“特殊”)并手动放置索引、类别等。

4

3 回答 3

0

Partialview 是解决方案:您可以创建一个局部视图,并在每次您希望它被使用或注入视图时添加它。您可以在该局部视图上运行 for 或 foreach 外观,并根据需要重复多次。

1:创建局部视图。2:把你想要渲染2次的所有东西放在局部视图中。3:用部分视图替换视图代码。喜欢:

@html.Partial("~/views/partials/_samplename.cshtml")

您可以在项目中的任何位置重复此局部视图,并且通过更改局部视图中的任何内容,它会随处更改。

于 2013-11-05T18:49:24.613 回答
0

无论您使用什么解决方案,都需要 JavaScript。jQuery 只是一个 JavaScript 框架,所以如果你愿意的话,你可以用别的东西把它换掉,但你应该坚持使用某种JavaScript 框架,因为执行 XMLHttpRequest 跨浏览器的代码很乏味并且容易出错。

至于您的 HTML,您可以选择在页面加载时将其作为模板包含在内,或者通过 AJAX 请求重新请求它。就个人而言,我会使用模板,因为在这种情况下 AJAX 并没有真正为你买任何东西,它只是一个额外的请求。

无论哪种方式,不幸的是,您都将无法使用 Razor HtmlHelper 方法,至少以后无论如何都不会通过 JavaScript 破坏 HTML;它们根本不会生成在 for 循环之外绑定列表对象所需的正确命名约定。模型绑定约定很容易手动复制,但它只是:

YourCollection[N].FieldName

因此,如果您Cars的模型上有一个列表,并且您想要一个字段来编辑Color第三辆车的,您可以使用:

Cars[2].Color

任何好的 JavaScript 模板解决方案都应该能够N根据对象在其他对象列表中的位置自动插入值。

于 2013-11-05T15:40:55.583 回答
0

您可以使用字符串构建器在控制器的 get 方法中动态创建 html,然后将其发布到视图。另一种方法是创建自己的 htmlhelper。

于 2013-11-05T19:06:50.463 回答