gpt4 book ai didi

asp.net-mvc - Asp.Net Razor View 将表达式传递给部分

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

我发现自己在我的观点中写了很多:

<div class="form-group">
@Html.LabelFor(x => x.City)
@Html.EditorFor(x => x.City)
@Html.ValidationMessageFor(x => x.City)
</div>

我真的很想把它放在一个部分 _Field.cshtml 中,像这样:

@model //what model type???

<div class="form-group">
@Html.LabelFor(Model)
@Html.EditorFor(Model)
@Html.ValidationMessageFor(Model)
</div>

然后可以通过以下方式调用:

@Html.Partial("_Field", x => x.City)

如果我想完成这样的事情,我的部分中的 @model 类型会是什么?

UPDATE 这行得通,但我宁愿使用 partial 以便于更改模板:

public static MvcHtmlString Field<TModel, TItem>(this HtmlHelper<TModel> html, Expression<Func<TModel, TItem>> expr)
{
var h = "<div class='form-group'>";
h += $"{html.LabelFor(expr)}{html.EditorFor(expr)}{html.ValidationMessageFor(expr)}";
h += "</div>";

return MvcHtmlString.Create(h);
}

最佳答案

那是不可能的。但是,您想要的与编辑器模板非常相似。本质上,您只需在 Views/Shared/EditorTemplates 中创建一个 View ,并根据以下约定之一命名:

  • 系统或自定义类型(String.cshtml、Int32.cshtml、MyAwesomeClass.cshtml 等)
  • DataType 枚举的成员之一(EmailAddress.cshtml、Html.cshtml、PhoneNumber.cshtml 等)。然后,您可以将适当的 DataType 属性应用于您的属性:

    [DataType(DataType.EmailAdress)]
    public string Email { get; set; }
  • 任何你想要的东西,结合 UIHint 属性:

    [UIHint("Foo")]
    public string Foo { get; set; }

    然后对应于 Foo.cshtml 编辑器模板

然后,在您的 View 中,您只需使用 Html.EditorFor:

@Html.EditorFor(x => x.City)

然后,例如,您可以将 Views/Shared/EditorTemplates/String.cshtml 设置为:

<div class="form-group">
@Html.Label("", new { @class = "control-label" })
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class = "form-control" })
@Html.ValidationMessage("")
</div>

(空引号是占位符。谢天谢地,Razor 会自动填写适当的属性名称。)

然后调用 EditorFor 将打印所有这些,而不仅仅是默认的文本输入。您也可以更进一步。我有 some articles在我的博客上有更详细的介绍,如果您有兴趣的话。

更新

值得一提的是 EditorFor 的一些特性:

  1. 您可以将模板直接传递给调用,这意味着您可以自定义动态和每个实例使用的模板:

    @Html.EditorFor(x => x.City, "MyCustomEditorTemplate")
  2. 您可以传递additionalViewData。此匿名对象的成员被添加到 ViewData 动态字典中。潜在地,您可以使用它在您的编辑器模板中进行分支以涵盖其他场景。例如:

    @Html.EditorFor(x => x.City, new { formGroup = false })

    然后在您的编辑器模板中:

    @{ var formGroup = ViewData["formGroup"] as bool? ?? true; }
    @if (formGroup)
    {
    <!-- Bootstrap form group -->
    }
    else
    {
    <!-- Just the input -->
    }

关于asp.net-mvc - Asp.Net Razor View 将表达式传递给部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41188062/

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