【问题标题】:mvc3 .net Display View Template using Html.DisplayFor使用 Html.DisplayFor 的 mvc3 .net 显示视图模板
【发布时间】:2012-02-02 19:27:42
【问题描述】:

我正在尝试使用模板。

我在使用 Html.DisplayFor 扩展时遇到问题

我希望模板以只读方式显示所有数据。我相信 HTML.DisplayFor 可以做到这一点?

如果是这样,我将一个 IEnumerable 模型传递给视图:

@model IEnumerable<Tens.Models.Applicant>

@{   
    if (Model != null)
    {  
          @Html.DisplayForModel("ApplicationOutcome") 
    } 
 }

和我的模板:

@model IEnumerable<Tens.Models.Applicant>

@{

foreach(var item in Model)
{
    @Html.TextBox("forenames",item.Forenames)
    <br />
    @Html.TextBox("surname",item.Surname)
    <br />
    <text>----------------------------------</text>
    <br>
}
}

上面的代码工作正常(显示 2 条记录),但这意味着我将每个字段的只读属性设置为 true(加载更多字段 - 太乏味了)。 我想要做的是使用 Html.DisplayFor 将此数据显示为只读,但我尝试了许多不同的方法并且无法让它工作。 任何帮助表示赞赏。

【问题讨论】:

    标签: .net asp.net-mvc-3 templates partial-views


    【解决方案1】:

    你的代码很奇怪。以下是我的做法。

    WhateverView.cshtml

    @model IEnumerable<Tens.Models.Applicant>  
    
    @Html.DisplayForModel()
    

    然后,在 DisplayTemplate 文件夹中:

    申请人.cshtml

    @model Tens.Models.Applicant
    
    @Html.LabelFor(m => Forenames)
    @Html.DisplayFor(m => m.Forenames)
    
    @Html.LabelFor(m => Surnames)
    @Html.DisplayFor(m => m.Surnames)
    

    等等。在模型是集合的情况下使用这样的模板的关键是该模板仅适用于单个项目(请注意,模板中没有 IEnumerable)。

    【讨论】:

      【解决方案2】:

      我发现如果我在模板中执行以下操作,我会按预期获得数据:

      @model IEnumerable<Tens.Models.Applicant>
      
      @{
      
      foreach(var item in Model)
      {
          @Html.DisplayFor(m=>item.Forenames)
          <br />
          @Html.DisplayFor(m=>item.Surname)
          <br />
          <text>----------------------------------</text>
      <br />
      }
      }
      

      【讨论】:

        【解决方案3】:

        如果您想了解更多信息,请阅读 Brad Wilson 的这篇文章。 http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html 基本上你看到的问题是由于这个检查类型对象的默认显示模板

        ViewData.TemplateInfo.TemplateDepth > 1
        

        而不是打电话

        @Html.DisplayForModel("ApplicationOutcome") 
        

        在您的视图中调用另一个模板。放

        foreach(var item in Model)
        {
            @Html.DisplayFor(m=>item)
        }
        

        直接在您的视图中。这应该会给您带来预期的结果。

        以下是我的 MVC 控制器/模型/视图文件。你可以试试这些。我没有任何特定于模型的模板文件,这是关键。将会发生的是 mvc 将使用默认模板来呈现该对象。

        DefaultController.cs(控制器)

        public class DefaultController : Controller
        {
            //
            // GET: /Default/
        
            public ActionResult Index()
            {
                var model = new List<Applicant>();
                model.Add(new Applicant{FirstName = "foo",LastName = "bar", Address = "Foo Bar"});
                model.Add(new Applicant { FirstName = "foo1", LastName = "bar1", Address = "Foo1 Bar1" });
                model.Add(new Applicant { FirstName = "foo2", LastName = "bar2", Address = "Foo2 Bar2" });
        
                return View(model);
            }
        }
        

        Application.cs(模型)

        public class Applicant
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string Address { get; set; }
        }
        

        Index.cshtml(视图)

        @model IEnumerable<MvcApplication1.Models.Applicant>
        @{
            Layout = null;
        }
        <html>
           <head>
             <title>this is a test</title>
           </head>
        <body>
            <h1>This is a test</h1>
            @if (Model != null)
            {
                foreach (var item in Model)
                {
                    @Html.DisplayFor(m => item)
                    <br/>
                }
            }
        </body>
        

        结果输出

        【讨论】:

        • 已阅读,但并没有真正回答我关于如何做到这一点的问题。将模板代码移到视图中,但这似乎不起作用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-05
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多