gpt4 book ai didi

asp.net-mvc-3 - Razor 局部 View 前缀字段名称

转载 作者:行者123 更新时间:2023-12-02 02:14:01 25 4
gpt4 key购买 nike

当使用 Razor 为具有子模型的复杂模型呈现表单时,我们通常会使用分部 View 来呈现子模型。

简单示例模型:

public class BlogPost
{
public string Content { get; set; }
public List<Comment> Comments { get; set; }
}

public class Comment
{
public string Content { get; set; }
}

BlogPost.cshtml:

@model BlogPost

@Html.TextAreaFor(x => x.Content)

@for (int i = 0; i < Model.Comments.Count; i++)
{
@Html.Partial('Comment', Model.Comments[i])
}

评论.cshtml:

@model Comment

@Html.TextAreaFor(x => x.Content)

现在的问题:

假设我们要将所有字段的值发送到以 BlogPost 作为参数的 Controller 操作。这些字段将像这样发送回 Controller :

Content=The+content+of+the+BlogPost&Content=The+first+Comment&Content=The+second+Comment

但是我们需要让 MVC 将它们正确映射到 BlogPost View 模型,我们需要这个命名约定:

Content=The+content+of+the+BlogPost&Comments[0].Content=The+first+Comment&Comments[1].Content=The+second+Comment

如何以干净的方式实现这一目标?我们只能想到两种似乎都在设计上妥协的方法:

  • 要么我们将 BlogPost 作为模型传递给局部 View ,这样我们就可以像这样定义文本区域:@Html.TextAreaFor(x => x.Comments[i] .内容)。但这意味着我们将评论的分部 View 耦合到父 View 模型——你可以想到这样一种场景,即同一个分部 View 应该在不同的上下文中使用,如果分部 View 依赖于父 View 模型,这是不可能的。此外,i 必须以某种方式传递给局部 View 。
  • 或者我们回过头来使用字符串明确定义每个字段的名称:@Html.TextArea(ViewBag.Prefix + ".Content")

有什么方法可以告诉分部 View 将某个前缀应用于所有 字段名称?

最佳答案

奇科多罗,

如果您创建类型为 Comment 的 EditorFor 模板,mvc 将为您完美地处理所有这些。但是,这仅适用于行已存在于数据库中的情况。来自 SO 的示例:

Submiting Parent & Children in razor

如果您需要即时创建新行,则必须使用一些小技巧来让字段按要求运行。我使用了 steven sandersons 网站上的一篇文章,它允许您在运行时添加集合项并且仍然保留不显眼的验证等。请参阅此 SO 问题和相关文章引用:

Editing a Variable Length List, ASP.NET MVC 3 Style with Table

关于asp.net-mvc-3 - Razor 局部 View 前缀字段名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11472847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com