ASP.NET MVC3 Вложенные частичные представления? - PullRequest
3 голосов
/ 13 июня 2011

Мне интересно, есть ли простой способ сделать следующее:

Скажем, у меня есть блог, в котором я хочу получить общее представление о прошлом количестве записей 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, который напомнил мне об этом вопросе, и я подумал, что добавлю интересную альтернативу, которая может быть особенно полезна, если вы собираетесь использовать MVVM-подход с каркасом ASP.NET MVC 3:

обратите внимание на то, как он использует приведенный ниже шаблон в этом посте: Панель задач KsigDo - модель представления пользовательского интерфейса в реальном времени, синхронизирующая пользователей с ASP.NET, SignalR, Knockout MVVM и 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 голосов
/ 13 июня 2011

Вы бы использовали первый в качестве основного вида

@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

EDIT:


Вы можете иметь список основных видов, который также может иметь макет вашего сообщения.

То, что вы также можете сделать, это наследовать ваши модели от модели основных видов

"~ / 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

...