- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
假设我有一个简单的模型来解释用途:
public class Category
{
...
public IEnumerable<Product> Products { get; set; }
}
查看:
@model Category
...
<ul>
@Html.EditorFor(m => m.Products)
</ul>
编辑器模板:
@model Product
...
<li>
@Html.EditorFor(m => m.Name)
</li>
请注意,我不必为 IEnumerable<Product>
定义 EditorTemplate , 我只能为 Product
创建它模型和 MVC 框架足够聪明,可以使用自己的 IEnumerable 模板。它遍历我的集合并调用我的 EditorTemplate。
输出的 html 会是这样的
...
<li>
<input id="Products_i_Name" name="Products[i].Name" type="text" value="SomeName">
</li>
毕竟我可以将其发布到我的 Controller 。
但是,当我使用模板名称定义 EditorTemplate 时,为什么 MVC 不执行此操作?
@Html.EditorFor(m => m.Products, "ProductTemplate")
在这种情况下,我必须将属性的类型更改为 IList<Product>
,自己遍历集合调用EditorTemplate
@for (int i = 0; i < Model.Products.Count; i++)
{
@Html.EditorFor(m => m.Products[i], "ProductTemplate")
}
这对我来说似乎是一种肮脏的解决方法。是否有其他更清洁的解决方案来执行此操作?
最佳答案
好了,现在我只欠Darin 9999啤酒
public static MvcHtmlString EditorForMany<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, IEnumerable<TValue>>> expression, string templateName = null) where TModel : class
{
StringBuilder sb = new StringBuilder();
// Get the items from ViewData
var items = expression.Compile()(html.ViewData.Model);
var fieldName = ExpressionHelper.GetExpressionText(expression);
var htmlFieldPrefix = html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix;
var fullHtmlFieldPrefix = String.IsNullOrEmpty(htmlFieldPrefix) ? fieldName : String.Format("{0}.{1}", htmlFieldPrefix, fieldName);
int index = 0;
foreach (TValue item in items)
{
// Much gratitude to Matt Hidinger for getting the singleItemExpression.
// Current html.DisplayFor() throws exception if the expression is anything that isn't a "MemberAccessExpression"
// So we have to trick it and place the item into a dummy wrapper and access the item through a Property
var dummy = new { Item = item };
// Get the actual item by accessing the "Item" property from our dummy class
var memberExpression = Expression.MakeMemberAccess(Expression.Constant(dummy), dummy.GetType().GetProperty("Item"));
// Create a lambda expression passing the MemberExpression to access the "Item" property and the expression params
var singleItemExpression = Expression.Lambda<Func<TModel, TValue>>(memberExpression,
expression.Parameters);
// Now when the form collection is submitted, the default model binder will be able to bind it exactly as it was.
var itemFieldName = String.Format("{0}[{1}]", fullHtmlFieldPrefix, index++);
string singleItemHtml = html.EditorFor(singleItemExpression, templateName, itemFieldName).ToString();
sb.AppendFormat(singleItemHtml);
}
return new MvcHtmlString(sb.ToString());
}
关于c# - EditorFor IEnumerable<T> 与 TemplateName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14038392/
我想获取我的项目名称的值,但警报结果始终是: Value: function(value){ return access(this, function(value){ return value ===
我有一个用于模型角色的 EditorFor 模板,如下所示。我也有用于 Date 的 EditorFor,当我直接从 View 使用 EditorFor 时它工作正常,但是当我在编辑器中使用 Edit
我有一个像这样的 EditorFor HTML 助手: @Html.EditorFor(m => m.Name, belowLevel ? disabledHtmlOptions : null) -
我的页面中有第二件事: @for (int i = 0; i @Html.EditorFor(m => Model.Option[i].Date, n
我在将 css 类添加到 HTML.EditorFor() 时遇到问题。如果有人有同样的问题,我正在网上搜索,但我找不到任何东西。 你能帮帮我吗?因此,未定义类不是 css 的问题,而是简单地说,它没
我想在我的应用程序中自动聚焦于 editorfor,但我似乎做不到。我已在文本框上成功使用自动对焦,但我想使用编辑器来保持我的应用程序的外观通用。 任何对此的解决方案将不胜感激,谢谢。 我的尝试: @
我希望我的复选框在未选中时禁用 EditorsFor,在选中时启用它们。我知道我必须使用JavaScript,我在网上找到了一些代码,但似乎它们不起作用。 这是我的查看代码: @{Html.Rende
在我看来,我有 4 个 EditorFor 字段,我想将它们设置为 DatePickers @Html.EditorFor(model => model.Date1)
我一直在尝试使用此代码在我的 EditorFor 上设置最小值和最大值: From Date: @Html.EditorFor(model => model.SelectedYearBegin, ne
假设你有一个像这样的模型: class Foo { public int A {get; set;} public int B {get; set;} } class SomeMode
到目前为止,我们可以使用 Html.EditorFor() 为数据类型动态呈现适当的模板 - 例如string、int 或自定义类型,例如“地址”。 现在我想使用 EditorFor() 来呈现一个“
昨天,经过大量测试,我得到了以下结果,可以根据 ViewBag.CanEdit 的值有选择地将 readonly 属性应用于控件; @Html.EditorFor(m => m.Location, n
使用 C# 绑定(bind)到 MVC3 中的 View 模型。 难以设置文本框的初始值,尝试在不必创建模板等的情况下这样做 有什么想法或者我必须沿着创建自定义模板的道路走下去吗? 谢谢,蒂姆 最佳答
您好,我为价格定义了一个小数字段,如下所示: [Required(ErrorMessage = "Asking Price/Rent is required.")] [Display(Name = "
这是我的 View 模型: [Required(ErrorMessageResourceType=typeof(Resources.ValidationsResources), E
有没有人写过或有办法使用属性名称而不是表达式来调用 EditorFor。 EditorFor("Code") 相对于 EditorFor(_ => _.Code) 我想写一些更通用的东西。通过创建表达
我有一个实体模型,它包含消息对象的集合,这些消息对象属于 Message 类型,具有多个属性,包括内容、MessageID、from 和 to。 我已经为 Message 类型创建了一个 Editor
我有一个具有以下属性的模型: [Required] [HiddenInput(DisplayValue = false)] public override int Id { get; set;} 现在
有没有办法为 Html.EditorFor 助手定义一个全局模板? 我想改变输出的标记,例如而不是渲染 它将呈现: 这适用于当我将 Html.EditorF
嗨,我对网页设计和语言(包括 JavaScript)还很陌生。 在强类型 cshtml View 中,是否可以仅显示基于复选框的文本字段(其中文本字段和复选框都对模型强类型化?)我创建了一个示例场景:
我是一名优秀的程序员,十分优秀!