用于IEnumerable的ASP.NET MVC EditorTemplate

时间:2012-07-14 20:05:55

标签: c# asp.net-mvc

我有一个包含2个属性的模型:stringIEnumerable<SomeModel>。如果我为UiHint指定string的editortemplate,则会应用它。但是当我为IEnumerable<SomeModel>属性指定它时,没有任何反应。我需要为IEnumerable做些什么特别的事情吗?

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您需要将IEnumerable替换为IList,然后使用以下方法:

public class OrderDTO
{
    ...
    public IList<OrderLineDTO> Lines { get; set; }
    ...
}

public class OrderLineDTO
{
    public int ProductID { get; set; }
    ...
    [Range(0, 1000)]
    public int Quantity { get; set; }
    ...
}

...
@for (int i = 0; i < Model.Lines.Count; ++i)
{
  ...
  @Html.EditorFor(x => x.Lines[i].Quantity)
  ...
}
...

适用于MVC 4.

答案 1 :(得分:0)

您的HintTemplate模型应为IEnumerable<SomeModel>(您将在编辑器模板中迭代模型)。或者,您可以在集合属性上使用EditorFor而不是UIHint注释(在这种情况下,EditorTemplate模型将是SomeModel;视图语法中不涉及迭代)。我已经提供了类似的回复in this post

如果您的模型看起来像

public class TestModel
{
    public string ParentName { get; set; }
    [UIHint("HintTemplate")]
    public IEnumerable<TestChildModel> children { get; set; }
}

ChildModel

public class TestChildModel
{
    public int id { get; set; }
    public string ChildName { get; set; }
}

你的HintTemplate.cshtml看起来应该是

@model IEnumerable<MVC3.Models.TestChildModel>

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <title>HintTemplate</title>
</head>
<body>
    @foreach(var a in Model)
    {
    <div style="background-color:#4cff00">
        @Html.DisplayFor(m => a.ChildName)
        @Html.EditorFor(m => a.ChildName)
    </div>
    }
</body>
</html>

您的观点

@model MVC3.Models.TestModel

@{
    ViewBag.Title = "Test";
}

<h2>Test</h2>
<div>
    @Html.LabelFor(a => a.ParentName)
    @Html.EditorFor(a => a.ParentName)
</div>
<div>
    @Html.LabelFor(a => a.children)
    @Html.EditorFor(a => a.children)
</div>