是否有一些罕见的语言构造我没有遇到过(比如我最近学到的一些,有些是关于Stack Overflow)在C#中得到一个表示foreach循环当前迭代的值?
例如,我目前根据具体情况做这样的事情:
int i = 0;
foreach (Object o in collection)
{
// ...
i++;
}
Run Code Online (Sandbox Code Playgroud) 假设我有一个简单的模型来解释目的:
public class Category
{
...
public IEnumerable<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
视图:
@model Category
...
<ul>
@Html.EditorFor(m => m.Products)
</ul>
Run Code Online (Sandbox Code Playgroud)
EditorTemplate:
@model Product
...
<li>
@Html.EditorFor(m => m.Name)
</li>
Run Code Online (Sandbox Code Playgroud)
请注意,我不必定义EditorTemplate IEnumerable<Product>,我只能为Product模型创建它,而MVC框架足够聪明,可以使用自己的IEnumerable模板.它遍历我的集合并调用我的EditorTemplate.
输出html将是这样的
...
<li>
<input id="Products_i_Name" name="Products[i].Name" type="text" value="SomeName">
</li>
Run Code Online (Sandbox Code Playgroud)
毕竟,我可以发布到我的控制器.
但是,当我使用模板名称定义EditorTemplate时,为什么MVC没有做到这一点?
@Html.EditorFor(m => m.Products, "ProductTemplate")
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我必须更改属性的类型,IList<Product>自己遍历集合并调用EditorTemplate
@for (int i = 0; i < Model.Products.Count; i++)
{
@Html.EditorFor(m => m.Products[i], "ProductTemplate")
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一种肮脏的解决方法给我.这样做是否还有其他更清洁的解决方案?
在我看来,我有这条线
@(Html.DisplayFor(m => m.DaysOfWeek, "_CourseTableDayOfWeek"))
Run Code Online (Sandbox Code Playgroud)
这里m.DaysOfWeek是一个IEnumerable<DateTime>.
有_CourseTableDayOfWeek.cshtml的内容:
@model DateTime
@{
ViewBag.Title = "CourseTableDayOfWeek";
}
<th>
@System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int) Model.DayOfWeek]
<span class="dateString">Model.ToString("G")</span>
</th>
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
传递到字典中的模型项的类型为'
System.Collections.Generic.List`1[System.DateTime]',但此字典需要类型为'System.DateTime' 的模型项.
如果我参考以下帖子:
本DisplayFor应通过的IEnumerable被循环并为每个项目显示模板,不应该吗?
我正在尝试输入正确的名称,以便我的视图模型上的对象集合可以被绑定.
@{ViewData.TemplateInfo.HtmlFieldPrefix = listName;}
@Html.EditorFor(m => m, "DoubleTemplate", new {
Name = listName,
Index = i,
Switcher = (YearOfProgram >= i +1)
})
Run Code Online (Sandbox Code Playgroud)
正如您在此处看到的,我将"listName"作为模板的前缀传递.listName ="MyItems"的值
这是我的模板:
@model Web.Models.ListElement
@if (ViewData["Switcher"] != null)
{
var IsVisible = (bool)ViewData["Switcher"];
var index = (int)ViewData["Index"];
var thisName = (string)ViewData["Name"] + "[" + index + "].Value";
var thisId = (string)ViewData["Name"] + "_" + index + "__Value";
if (IsVisible)
{
@*<input type="text" value="@Model.Value" name="@thisName" id ="@thisId" class="cell@(index + 1)"/>*@
@Html.TextBoxFor(m => m.Value, new { @class ="cell" …Run Code Online (Sandbox Code Playgroud) 我正在构建一个内部网,主页包含在显示大量不同数据位的小部件中.我有一个Home.cs模型,其中包含所需数据的各种IEnumerables属性.我一直在使用View文件夹DisplayFor模板来呈现该数据.我现在遇到一个问题,需要以两种不同的方式显示两个不同的工作人员名单.
我可以使用局部视图来呈现其中一个列表,也可以继承该类并使用不同的模板.继承看起来是必要的更多工作,我想知道是否有人知道MVC设计使用的特定方式或者可能只是任何人的首选解决方案?
我正在使用Microsoft的说明将MVC3应用程序升级到MVC4 .一切都进行得相当顺利 - 除了我的几个日期模型属性现在渲染方式不同.例如,其中一个属性在viewmodel中定义如下:
[Required(ErrorMessage = "Required")]
[DataType(DataType.Date)]
[RegularExpression(@"([1-9]|0[1-9]|1[012])...",
ErrorMessage = "Format is mm/dd/yyyy")]
[FormatHint("mm/dd/yyyy")]
[InputSize("small")]
public string Date { get; set; }
Run Code Online (Sandbox Code Playgroud)
在升级到MVC4之前,这将通过调用来呈现,@Html.EditorFor(m => m.Date)这将使用自定义的EditorTemplate - String.cshtml模板(因为它是一个字符串!).我有一些格式化html的自定义数据注释,因此它在客户端使用了字段布局,jQueryUI和twitter Bootstrap.验证是通过jquery验证完成的,不引人注目.无论如何,这是它以前呈现的方式:

现在我正在使用MVC4,String.cshtml不再为此属性调用编辑器模板.它呈现如下(在Chrome中使用HTML5编辑器的东西,我假设):

该input元素看起来几乎相同 - 所有的jQuery验证位都在那里 - 唯一的区别似乎是type属性现在type="date",之前的位置type="text".
我想继续使用String.cshtmlEditorTemplate来获取此数据类型.我想可能有一个数据注释,我可以放在ViewModel属性上为其提供TemplateHint @Html.EditorFor(...).如果不是这样,我想知道我可以编写的自定义EditorTemplate来劫持MVC4的格式(我已经尝试过了DateTime.cshtml- 它也没有被调用).如果不是其中任何一个,那么我愿意接受如何获得我以前的属性渲染的建议.