MVC3 - представление рендеринга, которое не является методом в контроллере

Я не знаю, как лучше всего описать мое требование, но вот. Я пытаюсь отобразить представление из следующего контроллера/модели в приложении nopCommerce:

Фрагмент CustomerController.cs:

[NonAction]
protected CustomerNavigationModel GetCustomerNavigationModel(Customer customer)
{
   var model = new CustomerNavigationModel();
   model.HideAvatar = !_customerSettings.AllowCustomersToUploadAvatars;
   model.HideRewardPoints = !_rewardPointsSettings.Enabled;
   model.HideForumSubscriptions = !_forumSettings.ForumsEnabled || !_forumSettings.AllowCustomersToManageSubscriptions;
   model.HideReturnRequests = !_orderSettings.ReturnRequestsEnabled || _orderService.SearchReturnRequests(customer.Id, 0, null).Count == 0;
   model.HideDownloadableProducts = _customerSettings.HideDownloadableProductsTab;
   model.HideBackInStockSubscriptions = _customerSettings.HideBackInStockSubscriptionsTab;
   return model;
}

CustomerNavigationModel.cs:

public partial class CustomerNavigationModel : BaseNopModel
{
    public bool HideInfo { get; set; }
    public bool HideAddresses { get; set; }
    public bool HideOrders { get; set; }
    public bool HideBackInStockSubscriptions { get; set; }
    public bool HideReturnRequests { get; set; }
    public bool HideDownloadableProducts { get; set; }
    public bool HideRewardPoints { get; set; }
    public bool HideChangePassword { get; set; }
    public bool HideAvatar { get; set; }
    public bool HideForumSubscriptions { get; set; }

    public CustomerNavigationEnum SelectedTab { get; set; }
 }

public enum CustomerNavigationEnum
{
    Info,
    Addresses,
    Orders,
    BackInStockSubscriptions,
    ReturnRequests,
    DownloadableProducts,
    RewardPoints,
    ChangePassword,
    Avatar,
    ForumSubscriptions
}

Фрагмент MyAccountNavigation.cshtml:

 @model CustomerNavigationModel
 @using Nop.Web.Models.Customer;
 @if (!Model.HideInfo)
 {
      <li><a href="@Url.RouteUrl("CustomerInfo")" class="@if (Model.SelectedTab == CustomerNavigationEnum.Info)
          {<text>active</text>}
          else
          {<text>inactive</text>}">@T("Account.CustomerInfo")</a></li>}

Представления: @Html.Partial("MyAccountNavigation", Model.NavigationModel, новый ViewDataDictionary())

Я знаю, что он не может отобразить MyAccountNavigation, потому что он не существует в контроллере. Однако в зависимости от того, на какой странице размещен синтаксис, он работает. Так есть ли способ добиться этого без изменения кода в контроллере? Заранее спасибо.


person scoo-b    schedule 10.09.2012    source источник
comment
Где находится ваше частичное представление? Представления, которые работают, где они расположены? Представления, которые не работают, где они находятся?   -  person    schedule 10.09.2012
comment
Файл частичного представления — ~/Views/Customer/MyAccountNavigation.cshtml, рабочие представления — в папке ~/Views/Customer/. Если я вставлю @Html.Partial(MyAccountNavigation, Model.NavigationModel, new ViewDataDictionary()) в любой файл в ~/Views/Shared/, это не сработает.   -  person scoo-b    schedule 11.09.2012


Ответы (2)


MVC ищет частичное представление в определенном порядке. Чтобы ваш частичный вид работал, вам нужно поместить MyAccountNavigation.cshtml' into~/Views/Shared/`

Я посмотрел на источник, и вот что происходит:

 public RazorViewEngine(IViewPageActivator viewPageActivator)
            : base(viewPageActivator)
        {
            AreaViewLocationFormats = new[]
            {
                "~/Areas/{2}/Views/{1}/{0}.cshtml",
                "~/Areas/{2}/Views/{1}/{0}.vbhtml",
                "~/Areas/{2}/Views/Shared/{0}.cshtml",
                "~/Areas/{2}/Views/Shared/{0}.vbhtml"
            };
            AreaMasterLocationFormats = new[]
            {
                "~/Areas/{2}/Views/{1}/{0}.cshtml",
                "~/Areas/{2}/Views/{1}/{0}.vbhtml",
                "~/Areas/{2}/Views/Shared/{0}.cshtml",
                "~/Areas/{2}/Views/Shared/{0}.vbhtml"
            };
            AreaPartialViewLocationFormats = new[]
            {
                "~/Areas/{2}/Views/{1}/{0}.cshtml",
                "~/Areas/{2}/Views/{1}/{0}.vbhtml",
                "~/Areas/{2}/Views/Shared/{0}.cshtml",
                "~/Areas/{2}/Views/Shared/{0}.vbhtml"
            };

            ViewLocationFormats = new[]
            {
                "~/Views/{1}/{0}.cshtml",
                "~/Views/{1}/{0}.vbhtml",
                "~/Views/Shared/{0}.cshtml",
                "~/Views/Shared/{0}.vbhtml"
            };
            MasterLocationFormats = new[]
            {
                "~/Views/{1}/{0}.cshtml",
                "~/Views/{1}/{0}.vbhtml",
                "~/Views/Shared/{0}.cshtml",
                "~/Views/Shared/{0}.vbhtml"
            };
            PartialViewLocationFormats = new[]
            {
                "~/Views/{1}/{0}.cshtml",
                "~/Views/{1}/{0}.vbhtml",
                "~/Views/Shared/{0}.cshtml",
                "~/Views/Shared/{0}.vbhtml"
            };

            FileExtensions = new[]
            {
                "cshtml",
                "vbhtml",
            };
        }

Нас интересуют AreaPartialViewLocationFormats и PartialViewLocationFormats.

Это объясняет, почему ваше представление обнаруживается, когда вы пытаетесь использовать его в представлениях, связанных с клиентом, и больше нигде оно не работает.

person Community    schedule 11.09.2012

Что бы я ни понял из вашего вопроса, вам нужно выполнить частичное представление «MyAccountNavigation» со многих страниц, и для этого вы можете поместить это частичное представление в общую папку.

Пожалуйста, поправьте меня, если я ошибаюсь.

Отредактированный текст

Базовый контроллер:

Метод ExcecuteCore

вы можете сохранить свое меню или эту модель в ViewBag, например

var customerNavigationModel = assigned your value;
ViewBag.MenuData = customerNavigationModel;

Из поля зрения

@{Html.RenderPartial("MyAccountNavigation", ViewBag.MenuData);}
person alok_dida    schedule 10.09.2012
comment
Я переместил MyAccountNavigation.cshtml в общую папку и изменил синтаксис на: @Html.Partial(MyAccountNavigation, new ViewDataDictionary(this.ViewData)), но возвращает ошибку: Ссылка на объект не указывает на экземпляр объекта. Строка 18: @if (!Model.HideInfo). - person scoo-b; 11.09.2012
comment
Эта ошибка возникает из-за того, что модель имеет значение null. Вам нужно сначала проверить Model != null, а затем проверить значение HideInfo. - person alok_dida; 12.09.2012
comment
Как я смогу просмотреть модель из защищенной модели CustomerNavigationModel GetCustomerNavigationModel (клиент-клиент)? Я пробовал @Html.Partial(~/Views/Customer/MyAccountNavigation.cshtml, новый Nop.Web.Models.Customer.CustomerNavigationModel()), но свойства не передаются в модель. Я ТОЛЬКО хочу изменить синтаксис в представлении, если это возможно. - person scoo-b; 18.09.2012
comment
@scoo-b . Я могу сказать, что вы хотите передать CustomerNavigationModel в этом частичном представлении. Для этого вам нужно сохранить CustomerNavigationModel в ViewBag из контроллера и получить то же значение из представления. Проверьте мой отредактированный код. - person alok_dida; 18.09.2012