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