MVC: динамический ascx для загрузки в представлении - PullRequest
0 голосов
/ 25 апреля 2011

Я создаю веб-сайт, который имеет, по сути, ту же модель, разница заключается в представлении.Если пользователь A войдет в систему, он увидит представление A. Если пользователь B войдет в систему, он увидит представление B. Это будет так для большинства страниц всего сайта.Я прочитал пост, в котором говорится, что я использую области.Но так как у меня есть те же модели для этих страниц, я думаю, что использую только один контроллер, и контроллер определит, какой вид загрузить.Я думаю использовать только одно представление aspx, а затем просто загрузить страницу ascx в зависимости от пользователя.Я не хочу использовать операторы if в моем представлении, чтобы определить, какой ascx отображать, как лучше всего это сделать?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 25 апреля 2011

Я использую ViewEngine, который ищет в подкаталоге папок представлений.В примере UserA получит представление из каталога UserA, если оно не существует, оно получит нормальное представление.

Если каталог Views выглядит следующим образом:

Views
|-> Home
|   |-> Index.cshtml
|   |-> UserA
|       |-> Index.cshtml
|-> Test
    |-> Index.cshtml

Тогда UserAполучит представление из Views / Home / UserA / Index.cshtml, а все остальные получат Views / Home / Index.cshtml.Каждый, в том числе UserA, получит /Views/Test/Index.cshtml, потому что для UserA его нет.

    public class MyViewEngine : WebFormViewEngine
    {
        public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            ViewEngineResult result = null;
            var request = controllerContext.HttpContext.Request;

            if (UserA)
            {
                result = base.FindView(controllerContext, "UserA/" + viewName, masterName, useCache);
            }

            //Fall back to normal view if no other view has been selected
            if (result == null || result.View == null)
            {
                result = base.FindView(controllerContext, viewName, masterName, useCache);
            }

            return result;
        }

        public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
        {
            ViewEngineResult result = null;
            var request = controllerContext.HttpContext.Request;

            if (UserA)
            {
                result = base.FindPartialView(controllerContext, "UserA/" + partialViewName, useCache);
            }

            //Fall back to normal view if no other view has been selected
            if (result == null || result.View == null)
            {
                result = base.FindPartialView(controllerContext, partialViewName, useCache);
            }

            return result;
        }
    }
0 голосов
/ 12 мая 2011

Спасибо за ответ.Вот решение моей проблемы, но я не знаю, является ли это лучшим.

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var action = filterContext.Result as ViewResult;
        if (action != null)
        {
            action.MasterName = ViewData["siteConstants"].ToString();
        }

        base.OnActionExecuted(filterContext);
    }

Что-то в этом роде.Я только что изменил строку action.MasterName.В методе Initialize в моем базовом контроллере в зависимости от пользователя я назначил значение ViewData ["siteConstants"], которое является именем главной страницы.Я также использовал customViewEngine, в котором я указал собственные пути к моей главной странице.

0 голосов
/ 25 апреля 2011

В контроллере вы решаете, какое представление ASCX будет отображаться, и передаете его как часть ViewModel или в ViewData

if (UserA)
{
   ViewData["thePartialView"] = "NameOfPartialViewForUserA"
}
else 
{
   ViewData["thePartialView"] = "NameOfPartialViewForUserB"
}

В представлении>

Html.RenderPartial(ViewData["thePartialView"]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...