ASP.NET MVC3 嵌套局部视图?

3
我想知道是否有一种简单的方法来实现以下内容:
假设我有一个博客,我想要查看过去X篇文章的主视图。
对于这些条目中的每一个,我都有一个小模板,包括标题、作者姓名、头像和正文。
这很简单,我可以为博客条目制作模板,但如果我想通过将另一个部分视图注入到我放置正文的位置来使用此模板以达到多个目的,有没有一种简单的方法在MVC3中实现这一点?如果这很简单,请原谅我,我可能错过了某个搜索术语:)
以下是一个示例:
每个“条目”的模板:
@{
    ViewBag.Title = "_Entry";
}

<link rel="stylesheet" href="@Url.Content("~/css/post.css")" /> 

<section id="content" class="body">
  <hgroup>
    <ol id="posts-list" class="feed">
      <li>
        <article class="entry">
          <header>
            <h2 class="entry-title">
                <a href="#" rel="bookmark" title="Permalink to this POST TITLE">
                </a>
            </h2>
          </header>
          <footer class="post-info">
            <abbr class="published" title="2005-10-10T14:07:00-07:00">
                <!-- YYYYMMDDThh:mm:ss+ZZZZ -->
            </abbr>
            <address class="vcard author">
                <a class="url fn" href="#">
                </a>
            </address>
          </footer>
        </article>
      </li>
      <li>
        <article class="entry">
          <footer class="post-info">
            <address class="vcard author">
                <img src=""></img>      
            </address>
          </footer>
          <!-- /.post-info -->
          <div class="entry-content">
            <p>
            </p>
        </div>
          <!-- /.entry-content --> 
        </article>
      </li>
    </ol>
  </hgroup>
  <!-- /#posts-list --> 
</section>

以下是一个示例,展示了如何在不同的上下文中使用它(除此之外,这代表了所需的最终表达式...我想知道是否有一种方法可以将Entry作为视图,并动态地将部分视图注入其中(在下面的示例中,“注入”将用于登录视图):

@model MyTemplate.Models.LogOnModel

@{
    Page.Title = "Log On";
}

@section HeadContent
{
    <link rel="stylesheet" href="@Url.Content("~/css/openid.css")" />   
    <link rel="stylesheet" href="@Url.Content("~/css/post.css")" />
}
@section ScriptSection
{
    <script type="text/javascript" src="@Url.Content("~/js/libs/openid-jquery.js")"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            openid.init('openid_identifier');
        });
    </script>
    <script src="http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
    <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.8.1/jquery.validate.min.js" type="text/javascript"></script>
}

<section id="content" class="body">
  <hgroup>
    <ul id="posts-list" class="feed">
      <li>
        <article class="entry">
          <header>
            <h2 class="entry-title">
                <a href="#" rel="bookmark" title="Permalink to this POST TITLE">
                    Account Login
                </a>
            </h2>
            <p>
                >>
                </br>
                Please enter your username and password. 
                <br />
                <br />
                @Html.ActionLink("Register", "Register") if you don't have an account.
            </p>
          </header>
        </article>
      </li>
      <li>
        <article class="entry">
          <footer class="post-info">
            <address class="vcard author">
                <img src="../img/Hive.png" alt="units" id="gravatar" width="175" height="175" class="imageBorderRadius"></img>      
            </address>
          </footer>
          <!-- /.post-info -->
          <div class="entry-content">
                    @Html.ValidationSummary(true)
                    @using (Html.BeginForm()) {
                        <div>
                            <fieldset>
                                <legend>Account Information</legend>

                                <div class="editor-label">
                                    @Html.LabelFor(m => m.UserName)
                                </div>
                                <div class="editor-field">
                                    @Html.TextBoxFor(m => m.UserName)
                                    @Html.ValidationMessageFor(m => m.UserName)
                                </div>

                                <div class="editor-label">
                                    @Html.LabelFor(m => m.Password)
                                </div>
                                <div class="editor-field">
                                    @Html.PasswordFor(m => m.Password)
                                    @Html.ValidationMessageFor(m => m.Password)
                                </div>

                                <div class="editor-label">
                                    @Html.CheckBoxFor(m => m.RememberMe)
                                    @Html.LabelFor(m => m.RememberMe)
                                </div>

                                <p>
                                    <input type="submit" value="Log On" />
                                </p>
                            </fieldset>
                        </div>
         }
        </div>
          <!-- /.entry-content --> 
        </article>
      </li>
    </ul>
  </hgroup>
  <!-- /#posts-list --> 
</section>

@Html.Partial("_OpenId")

任何指导都将不胜感激。
谢谢!
编辑:2012年02月12日
正如我在接受的答案的评论中所指出的,我意识到我真正想要采用MVVM方法,尽管该框架的名称可能在某些情况下是完全可行的想法。
我正在阅读Anoop的博客文章,这篇文章让我想到了这个问题,我想添加一个有趣的替代方案,特别是在您使用ASP.NET MVC 3框架采用MVVM方法的情况下可能非常有用:
请注意,他在此帖子中使用以下模板:KsigDo Task Pad – Real-Time UI View Model syncing across users with ASP.NET, SignalR, Knockout MVVM and EF
<script type="text/html" id="taskTemplate">
    <li  style="list-style-image: url('/images/task.png')">
        <input type="checkbox" data-bind="checked: completed" />
        <input class="ui-corner-all" data-bind="value: title, enable: !completed()" />
        <input class="ui-button" type="button" href="#" data-bind="click: remove" value="x"></input>
    </li>
</script>
1个回答

4
您可以将第一个用作主视图。
@model MyTemplate.Models.LogOnModel
@ {
     Layout = "~/Views/LAYOUT OF THE MASTER PAGE" ;  
     Page.Title = "Log On";
 }

请查看此链接以获取更多信息:

http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx

编辑:


您可以拥有一组主视图,您的文章视图也可以有一个布局。

您还可以从主视图的模型继承您的模型。

"~/Views/Shared/Master.cshtml"

@model MyTemplate.Models.MasterModel
@ {
     Page.Title = "Log On";
 }

"~/Views/Shared/Post.cshtml"

@model MyTemplate.Models.PostModel
@ {
     Layout = "~/Views/Shared/master.cshtml" ;  
 }

"~/Views/Post/default.cshtml"

@model MyTemplate.Models.LogOnModel
@ {
     Layout = "~/Views/Shared/Post.cshtml" ;  
     Page.Title = "Log On";
 }

LogOnModel继承自PostModel,而PostModel又继承自MasterModel。


你确定我可以这样做吗?我已经有了一个带有页眉和页脚的主版面。这是为每个条目实例在页眉和页脚之间显示而设计的。 - Jordan
但我应该补充一点,这基本上就是我所要寻找的...类似于@RenderBody()(或对于每个条目@RenderBody()),但其中“布局”将针对该视图而不影响主布局视图。 - Jordan
是的,您可以拥有主视图的层次结构。A 可以是 B 的主视图,B 可以是 C 的主视图。 - Kyle
啊,好的...那很简单。我不确定为什么这个问题在文档中难以找到(可能是我的搜索词)。不管怎样...我会晚些时候测试并确认是否有效。谢谢! - Jordan
好的,这绝对是一个可接受的答案,可能是最佳实践(我使用了一个部分视图来替代 LogOnModel)。我不认为我表达得很清楚,但我意识到我试图做的是让MVC更像MVVM(我过去两年一直在使用Silverlight):P - Jordan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接