MVC动态“扩展”@ Html.EditorFor()

时间:2014-07-31 13:49:12

标签: c# asp.net-mvc angularjs model-view-controller client-side

假设我有一个带有一些字符串属性的模型。

想象一下,这个字符串属性实际上是一个以逗号分隔的值列表。

如果我想创建一个表单来更新我的模型上的值,那么很容易调用:

@Html.TextBoxFor(model => model.myCommaDelimitedProp, new { @class = "form-control", placeholder = "CommaDelimitedPropValue" })

但是,这对于预期的应用来说还不够好。

我想有一个自定义的EditorFor(),它可以以某种方式获取我的属性,使用字符串解析,然后生成一个文本框数组来显示预先存在的值。

这也是相对微不足道的。

然而,我似乎无法解决,主要是因为我缺乏客户端经验(js,jquery,angular,......):

我怎样才能让我的编辑器有一个小按钮,这样我就可以动态添加行,填充它们,这样,在表单提交时,我可以将新值串在预先存在的字符串上。

具体来说,你们有什么用来实现这种客户端行为?

我只需要一些帮助就可以了......

1 个答案:

答案 0 :(得分:1)

您可以使用编辑器模板实现此目的。有一个quick intro I threw together on my blog。您唯一需要的是UIHint。由于您无法依赖特定的C#类型或DataType注释来确定应将其视为逗号分隔的属性。您可以直接告诉Razor应该使用哪个模板。例如:

[UIHint("CommaDelimited")]
public string MyCommaDelimitedProperty { get; set; }

哪个对应于编辑器模板:Views\Shared\EditorTemplates\CommaDelimited.cshtml。一旦你设置了那个视图你喜欢它。然后在您的表单中,您只需致电:

@Html.EditorFor(m => m.MyCommaDelimitedProperty)

修改

我将留下我之前的答案,因为它可以在为特定类型的事物生成控件方面仍然有用。您实际上可能仍需要使用它来在您的字段上进行正确的设置,以使JS正常工作。

然而,当谈到客户端对此的处理时,我认为必须有一些东西来解决这个问题。 (绝不要做比你更多的工作。)粗略搜索出现了一个名为Tokenfield for Bootstrap的小脚本。我不确定你是否使用Bootstrap。如果没有,我还找到了jQuery Tokeninputjquery.token-field。我也确定还有其他人。