相关疑难解决方法(0)

在ASP.NET MVC中使用自定义编辑器模板和IEnumerable模型的正确,惯用方法

这个问题是为什么我的DisplayFor没有遍历我的IEnumerable <DateTime>的后续行动


快速刷新.

什么时候:

  • 该模型具有类型的属性 IEnumerable<T>
  • 您将此属性传递给Html.EditorFor()使用仅接受lambda表达式的重载
  • T在Views/Shared/EditorTemplates下有一个类型的编辑器模板

然后MVC引擎将自动为可枚举序列中的每个项调用编辑器模板,生成结果列表.

例如,当存在Order具有属性的模型类时Lines:

public class Order
{
    public IEnumerable<OrderLine> Lines { get; set; }
}

public class OrderLine
{
    public string Prop1 { get; set; }
    public int Prop2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并且有一个视图Views/Shared/EditorTemplates/OrderLine.cshtml:

@model TestEditorFor.Models.OrderLine

@Html.EditorFor(m => m.Prop1)
@Html.EditorFor(m => m.Prop2)
Run Code Online (Sandbox Code Playgroud)

然后,当您@Html.EditorFor(m => m.Lines)从顶级视图调用时,您将获得一个页面,其中包含每个订单行的文本框,而不仅仅是一个.


但是,正如您在链接问题中看到的那样,这仅在您使用特定的重载时才有效EditorFor.如果您提供模板名称(为了使用未在OrderLine类之后命名的模板),则不会发生自动序列处理,而是会发生运行时错误.

此时,您必须将自定义模板的模型声明为IEnumebrable<OrderLine>并以某种方式手动迭代其项目以输出所有这些项目,例如

@foreach (var line in Model.Lines) {
    @Html.EditorFor(m …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc ienumerable view-templates razor-3

50
推荐指数
1
解决办法
2万
查看次数

对集合中的每个项目使用DisplayTemplate(带DisplayFor)

我为一个Comment类创建了一个DisplayTemplate ,并将其放在里面Comment/DisplayTemplates/Comment.cshtml.

Comment.cshtml 输入正确:

@model Comment
Run Code Online (Sandbox Code Playgroud)

然后,我有一个局部视图,需要一个IEnumerable<Comment>模型.在那里,我遍历集合,并希望使用DisplayTemplate为Comment类.该观点,其完整性:

@model IEnumerable<Comment>

@foreach (var comment in Model.Where(c => c.Parent == null)) { 
    @Html.DisplayFor(model => comment)
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误Html.DisplayFor:

传递到字典中的模型项的类型为"System.Int32",但此字典需要"System.String"类型的模型项.

如何为foreach循环中的每个项调用DisplayTemplate ?

asp.net-mvc razor display-templates asp.net-mvc-3

22
推荐指数
2
解决办法
2万
查看次数

MVC3 IEnumerable模型找不到正确的编辑器模板

我有以下型号:

public class Filter
{
    public string Field { get; set; }

    public string Operator { get; set; }

    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以下控制器:

public class FilterController
{
    public ActionResult Index()
    {
        IList<Filter> model = new List<Filter>() {
            new Filter(), 
            new Filter()
        };

        return View(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下观点:

@model IEnumerable<Filter>
@Html.EditorForModel()
Run Code Online (Sandbox Code Playgroud)

这应该查找我的EditorTemplate Filter.cshtml,并为列表中的每个元素渲染模板,对吧?

使用Glimpse,我注意到MVC正在寻找IEnumerable`1.cshtml而不是Filter.cshtml

我使用时会发生同样的事情

@Html.EditorFor(model => model)
Run Code Online (Sandbox Code Playgroud)

当我这样做:

@Html.EditorFor(model => model, "Filter")
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,说它Filter.cshtml期待一个类型的模型,Filter但它收到了一个类型的模型IEnumerable<Filter>

我这样做了吗?我是否需要做任何其他事情才能使用正确的编辑器模板正确渲染模型列表?

ienumerable mvc-editor-templates razor asp.net-mvc-3

5
推荐指数
1
解决办法
1270
查看次数

MVC嵌套模型集合

我是MVC的新手,我正在尝试从页面上的嵌套模型集合中显示信息.

所以我的模型如下:

public partial class Parent
{
    public Parent()
    {
        this.Childs = new HashSet<Child>();
     }

    public int ParentID { get; set; } 
     public string Name { get; set; } 

    public virtual ICollection<Child> Childs { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

要在我使用的父视图上显示信息:

@foreach (Child c in Model.Childs)
{
    @c.Name 
}
Run Code Online (Sandbox Code Playgroud)

上面的工作,但我想为孩子们使用不同的视图,所以我尝试了以下内容:

@Html.DisplayFor(model => model.Childs)
Run Code Online (Sandbox Code Playgroud)

并定义了以下视图:

@model WebApplication1.Models.Child

<div>
      @Html.DisplayFor(model => model.Name)
</div>
Run Code Online (Sandbox Code Playgroud)

这不起作用,我得到的是显示System.Data.Entity.DynamicProxies而不是子名称列表.我已经读过这是因为MVC5不知道要使用什么视图.我已经尝试在显示中指定视图, @Html.DisplayFor(model => model.Childs, "ViewName1.cshtml")但这根本没有帮助.

除了上面我想用类似的东西@Html.EditorFor(model => model.Childs).

c# asp.net-mvc entity-framework

4
推荐指数
2
解决办法
1298
查看次数

迭代收集并在Razor中打印索引和项目

我的剃刀视图有问题.我有以下内容:

public ICollection<Topic> Topics

public class Topic
{
    public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想遍历集合并打印出如下结果:

    @foreach (int index in Enumerable.Range(0, Model.Topics.Count())){

        <div>@(index). Model.Topics[@(index)].Description"</div>
    }
Run Code Online (Sandbox Code Playgroud)

问题是我得到的只是:

0. Model.Topics[0].Description"
1. Model.Topics[1].Description"
Run Code Online (Sandbox Code Playgroud)

我尝试了各种各样的东西,但仍然无法得到描述.

我究竟做错了什么 :-(

asp.net-mvc razor asp.net-mvc-3

3
推荐指数
2
解决办法
3万
查看次数