Asp.Net Razor视图将表达式传递给部分

时间:2016-12-16 15:55:50

标签: asp.net-mvc razor

我发现自己在观点中写了很多这样的内容:

  <%= link_to "My document", @ticket.attachment.url, target: "_blank" %>

我真的很想把它放在Partial <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

1 个答案:

答案 0 :(得分:3)

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

  • 系统或自定义类型(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编辑器模板

在您的观看中,您只需使用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 -->
    }