相关疑难解决方法(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万
查看次数

ASP.NET MVC3在调用Controller.PartialView时添加HtmlFieldPrefix

我将部分视图呈现为Ajax请求的一部分.

当我从视图中调用局部视图时:

int i=0;
foreach(var rule in Model.Rules) {
    @Html.Partial("ValidationRuleRow", rule, new ViewDataDictionary { 
        TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = string.Format("Rules[{0}]", i) } })   
    i++;
}
Run Code Online (Sandbox Code Playgroud)

我能够设置HtmlFieldPrefix以允许正确的模型绑定.

我希望用户能够通过ajax动态添加新的ValidationRuleRow,如:

$.ajax({
    type: "GET",
    url: "/Monitors/NewMonitorValidationRule",
    success: function (data, textStatus, jqXHR) {
        var element = $(data);
        $("#ValidationRuleContainer").append(element);
    }
});
Run Code Online (Sandbox Code Playgroud)

所以我在我的控制器中有一个动作来获取HTML:

public ActionResult NewMonitorValidationRule()
{
    ValidationRule rule = new ValidationRule{Id = TempSurrogateKey.Next};
    var view = PartialView("ValidationRuleRow", rule);
    // CODE TO SET PartialView field prefix
    return view;
}
Run Code Online (Sandbox Code Playgroud)

返回的HTML没有前缀.无论如何在从Controller中的Action调用PartialView时设置前缀?

asp.net-mvc-3

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