Используйте один и тот же вид и частичный вид на двух вкладках, которые изменяют основы на основе оригинала или поправки - PullRequest
0 голосов
/ 21 сентября 2018

Я ищу реализацию меню вкладок, которое использует тот же вид и частичный вид.Но затем при нажатии на любую из вкладок она обновляется на основе сравнения в модели.Контроллер определяет, является ли он Оригиналом или Поправкой.Пока у меня есть две вкладки, показывающие с помощью:

var fullAccountCodeOriginal = Model.OriginalWriter.ID;
var fullAccountCodeAmendment = Model.ActiveAmendmentWriter.ID;

<div class="page-tabs">
<ul class="nav nav-tabs">
    <li class='@((actionName.ToLower() == "viewwriteramendments") &&
           controllerName.ToLower() == "songsmanagement" ? "active" : "")'>
        <a href='@Url.Action("ViewWriterAmendments", "SongsManagement", new
            {
                accountcode = fullAccountCodeOriginal
            })' data-container="body" data-toggle="tooltip" title="Song Management">Original Track Details</a>
    </li>
    <li class='@((actionName.ToLower() == "viewwriteramendments") &&
              controllerName.ToLower() == "songsmanagement" ? "active" : "")'>
        <a href='@Url.Action("ViewWriterAmendments", "SongsManagement", new
            {
                accountcode = fullAccountCodeAmendment
            })' data-container="body" data-toggle="tooltip" title="Song Management">Updated Track Details</a>
    </li>
    }
</ul>

В модели есть:

public ViewWriterAmendmentsComparisonModel()
    {
        this.OriginalWriter = default(WriterAmendmentsComparisionModel);
        this.ActiveAmendmentWriter = default(WriterAmendmentsComparisionModel);
    }

    public WriterAmendmentsComparisionModel OriginalWriter { get; set; }
    public WriterAmendmentsComparisionModel ActiveAmendmentWriter { get; set; }

Контроллер

 var writerAndActiveAmendment = new ViewWriterAmendmentsComparisonModel
        {
            OriginalWriter = new WriterAmendmentsComparisionModel
            {
                ID = domainWriterAndAmendmentModel.Original.ID,
                RowVersion = domainWriterAndAmendmentModel.Original.RowVersion,
                IsDeleted = domainWriterAndAmendmentModel.Original.IsDeleted,
                IsLocked = domainWriterAndAmendmentModel.Original.IsLocked,
                IsNew = domainWriterAndAmendmentModel.Original.IsNew,
                Version = domainWriterAndAmendmentModel.Original.Version,
                FirstName = domainWriterAndAmendmentModel.Original.FirstName,
                MiddleName = domainWriterAndAmendmentModel.Original.MiddleName,
                LastName = domainWriterAndAmendmentModel.Original.LastName,
                PRO = domainWriterAndAmendmentModel.Original.Society?.Name ?? string.Empty,
                CaeIpiNumber = domainWriterAndAmendmentModel.Original.CaeIpiNumber,
                IsProMember = domainWriterAndAmendmentModel.Original.IsProMember,

                Songs = domainWriterAndAmendmentModel.Original.WriterSplits != null
                    ? domainWriterAndAmendmentModel.Original.WriterSplits
                        .Select(x => new AssociatedSongsComparisonModel
                        {
                            // meta
                            ID = x.ID,
                            RowVersion = x.RowVersion,
                            IsDeleted = x.IsDeleted,

                            // data
                            SongTitle = x.RelatedWork.Title,
                            SongId = x.RelatedWork.UniqueCode,
                            CreatedDate = x.RelatedWork.CreatedDate,
                            WriterCount = x.RelatedWork.WorkSplits.Count,
                            RecordingCount = x.RelatedWork.Recordings.Count
                        })
                        .ToList()
                    : new List<AssociatedSongsComparisonModel>(),
            },
            ActiveAmendmentWriter = new WriterAmendmentsComparisionModel
            {
                ID = domainWriterAndAmendmentModel.CurrentAmendment.ID,
                RowVersion = domainWriterAndAmendmentModel.CurrentAmendment.RowVersion,
                IsDeleted = domainWriterAndAmendmentModel.CurrentAmendment.IsDeleted,
                IsNew = domainWriterAndAmendmentModel.CurrentAmendment.IsNew,
                FirstName = domainWriterAndAmendmentModel.CurrentAmendment.FirstName,
                MiddleName = domainWriterAndAmendmentModel.CurrentAmendment.MiddleName,
                LastName = domainWriterAndAmendmentModel.CurrentAmendment.LastName,
                PRO = domainWriterAndAmendmentModel.CurrentAmendment.Society?.Name ?? string.Empty,
                CaeIpiNumber = domainWriterAndAmendmentModel.CurrentAmendment.CaeIpiNumber,
                IsProMember = domainWriterAndAmendmentModel.CurrentAmendment.IsProMember,

                Songs = domainWriterAndAmendmentModel.CurrentAmendment.WriterSplitAmendments != null
                    && domainWriterAndAmendmentModel.CurrentAmendment.WriterSplitAmendments.Any(x => x.RelatedWorkAmendment != null)
                    ? domainWriterAndAmendmentModel.CurrentAmendment.WriterSplitAmendments
                        .Select(x => new AssociatedSongsComparisonModel
                        {
                            // meta
                            ID = x.ID,
                            RowVersion = x.RowVersion,
                            IsDeleted = x.IsDeleted,

                            // data
                            SongId = x.RelatedWorkAmendment.UniqueCode,
                            SongTitle = x.RelatedWorkAmendment.Title,
                            CreatedDate = x.RelatedWorkAmendment.CreatedDate,
                            WriterCount = x.RelatedWorkAmendment.WorkSplitAmendments.Count,
                            RecordingCount = x.RelatedWorkAmendment.RecordingAmendments.Count
                        })
                        .ToList()
                    : new List<AssociatedSongsComparisonModel>(),
            }
        };
        return writerAndActiveAmendment;
    }


    [HttpGet]
    [ActionName("ViewWriterAmendments")]
    [Route("{writercode}/ViewWriterAmendments")]
    [AuthorizeTenancy(Roles = "super,administrator")]
    public async Task<ActionResult>ViewWriterAmendments(string writercode, int page = 1, int take = Constants.MVC.Pagination.DefaultItemsPerPage, string sortBy = "Name", bool sortAsc = true)
    {
        if (Request.QueryString["IsAmendment"] != null)
        {
            ViewBag.IsAmendment = Request.QueryString["IsAmendment"];
        }
        else
        {
            ViewBag.IsAmendment = "0";
        }

        // TEST IF VALID
        // ajax method - refuse
        if (Request.IsAjaxRequest())
        {
            return RedirectToAction("WriterAmendments", "SongsManagement");
        }

        // no writer - refuse
        if (string.IsNullOrEmpty(writercode))
        {
            return RedirectToAction("WriterAmendments", "SongsManagement", new { page, take, sortBy, sortAsc });
        }

        // get originalWithPossibleActiveAmendment work
        var writerAndAmendment = await _artistAccountService.GetWriterAndAmendmentGraphAsync(writercode, includeWritersSplitsAndWorks: true, includeWriterSociety: true);
        // not found? - refuse
        if (writerAndAmendment.Original == default(WriterGraph.Writer))
        {
            return RedirectToAction("WriterAmendments", "SongsManagement", new { page, take, sortBy, sortAsc });     // something wrong
        }
        // writer locked? - refuse
        if (writerAndAmendment.Original.IsLocked)
        {
            return RedirectToAction("WriterAmendments", "SongsManagement", new { page, take, sortBy, sortAsc });     // something wrong
        }

        // setup view model
        var viewModel = MapWriterAndAmendmentToViewModel(writerAndAmendment);

        // return view
        return View(viewModel);
    }
}

}

Есть ли способ заставить его переключаться между двумя вкладками, используя JQuery или другой метод, возможно, IF / ELSE в Razor.Я новичок в MVC.

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете просто использовать jQuery, чтобы в Controller вы получили, например, параметр Enum (если более двух случаев загрузки данных) или логический флаг, какой контент загружать.Затем, основываясь на полученном параметре, вы создаете оператор if внутри контроллера, чтобы решить, какие данные вы должны загрузить.Это довольно просто, я не дам тебе рыбу, кроме удочки.Читайте о переопределении в кнопке jQuery для события click и отправке ajax-запросов.

Дополнительные советы.ИМХО, это выглядит ужасно

<li class='@((actionName.ToLower() == "viewwriteramendments") &&
          controllerName.ToLower() == "songsmanagement" ? "active" : "")'>
    <a href='@Url.Action("ViewWriterAmendments", "SongsManagement", new
        {
            accountcode = fullAccountCodeAmendment
        })' data-container="body" data-toggle="tooltip" title="Song Management">Updated Track Details</a>
</li>
  1. Передача активного класса должна выполняться и внутри jQuery.
  2. Если вы создаете повторяющиеся элементы li, вы можете подумать о создании другого частичного представления дляих.Для 2 это хорошо, но для большего количества элементов создайте отдельный вид.

  3. Измените href на какую-то кнопку и переопределите ее поведение по умолчанию.

  4. Соглашения об именах - попробуйте присвоить вашим идентификаторам и классам какое-то стабильное соглашение для всего проекта.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...