none
Veiw (Представление) MVC RRS feed

  • Вопрос

  • Подскажите как реализовать следующие.
    На главной странице есть блок Новостей. Этот блок должен в замостите от контента (главная сейчас страница или внутренняя) отображаться по разному. На главной блок должен быть широкий и отображать к примеру пару новостей, если находимся в каком то другом разделе, то блок Новостей должен быть узкий, если зашли в раздел новости, там этот блок широкий и более информативный. Получается три вида блока новостей.
    Разделять на три разные вьюшки не хочется. Есть более хитрый способ, подскажите.
    Использую представления Razor
    С# VS2012 MVC4

    Спасибо
    11 июня 2013 г. 10:44

Ответы

  • Примерно так это выглядит:

    @{Html.RenderPartial("MemberPartial", new MvcApplication.ConfigModel() { IsMainPage = false });}

    и частичное представление

    @*Частичное представление.*@
    @model MvcApplication.ConfigModel
    
    <div>
    
      @{
        if(Model.IsMainPage == true)
        {
          @*Разметка для главной страницы.*@
        }
        else
        {
          @*Разметка для другой страницы.*@
        }
      }
    
    </div>

    12 июня 2013 г. 6:22
    Модератор
  • Чтобы не дублировать один и тот же код (разметку) используйте частичные представления. А в нём уже задаёте разное поведение этой самой разметки в зависимости от положения на странице, скажем например через свойство модели.
    11 июня 2013 г. 11:00
    Модератор

Все ответы

  • Чтобы не дублировать один и тот же код (разметку) используйте частичные представления. А в нём уже задаёте разное поведение этой самой разметки в зависимости от положения на странице, скажем например через свойство модели.
    11 июня 2013 г. 11:00
    Модератор
  • При этом ведь создаться три разные вьюшки?

    Просто говорят, что можно сделать хитрый код ("если в представлениях есть что-то общее, можно делать хитрый код, который будет подстраиваться под ситуацию и выдавать нужный вид в зависимости от ситуации") Не используя разные представления.

    При этом не разглашается как :(

    11 июня 2013 г. 11:32
  • Сначала ответ в обобщённом виде, без кода так как это быстро, поскольку на рабочем месте много времени нет, чтобы подвердить ответ кодом. Если в теории непонятно, то постараюсь привести маленький пример позже.
    11 июня 2013 г. 11:40
    Модератор
  • Буду благодарен, позже покажу как я сделал, но у меня используются разные вьюшки для каждого блока.

    В контроллере

           [ChildActionOnly]
            public ActionResult Index() //для трех разных вьюшек разные названия
            {
                var mostRecentEntries =
                  (from entry in db.Posts
                   orderby entry.DateCreated descending
                   select entry).Take(3);
                ViewBag.Post = mostRecentEntries.ToList();
                return PartialView();
            }

    Представление

    @model IEnumerable<Loskutok2.Models.Post>
    @{
        ViewBag.Title = "Новости";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    <div class="box-header news-big">
        <div class="box-footer">
            <div class="box">
                <h1>Новости</h1>
                @* first news *@
                @foreach (var entry in ViewBag.Post)
                {
                    <div class="news-box">
                        <table>
                            <tr>
                                <td>
                                    <img src="~/images/news-img-place-holder.jpg" width="88" height="68" />
                                </td>
                                <td>
                                    @*   @entry.Title *@
                                    @entry.DateCreated.ToLongDateString()
                                    <p>@entry.TextSmallNews
                                    @*  @entry.DateCreated.ToLongDateString()  *@
                                    <a href="#" title="читать далее..." class="readmore">читать далее...</a></p>
                                </td>
                            </tr>
                        </table>
                    </div>
                }
            </div>
        </div>
    </div>
    три таких представления с разной разметкой.


    • Изменено SanteR_ 12 июня 2013 г. 4:08
    11 июня 2013 г. 11:44
  • Примерно так это выглядит:

    @{Html.RenderPartial("MemberPartial", new MvcApplication.ConfigModel() { IsMainPage = false });}

    и частичное представление

    @*Частичное представление.*@
    @model MvcApplication.ConfigModel
    
    <div>
    
      @{
        if(Model.IsMainPage == true)
        {
          @*Разметка для главной страницы.*@
        }
        else
        {
          @*Разметка для другой страницы.*@
        }
      }
    
    </div>

    12 июня 2013 г. 6:22
    Модератор