В методе CreateView () (проверьте мой View Engine ниже) или в моем фильтре настраиваемых действий (также ниже) я должен каким-то образом проверить, является ли View, который мы запрашиваем, ViewUserControl.Потому что в противном случае я получаю сообщение об ошибке:
"Имя мастера не может быть указано, когда представление является ViewUserControl."
, когда у меня есть "modal = true" в QueryStringи запрос View является ViewUsercontrol, потому что вы не можете установить главную страницу для ViewUserControls (очевидно).
Это мой код механизма пользовательского представления прямо сейчас:
public class PendingViewEngine : VirtualPathProviderViewEngine
{
public PendingViewEngine()
{
// This is where we tell MVC where to look for our files.
/* {0} = view name or master page name
* {1} = controller name */
MasterLocationFormats = new[] {"~/Views/Shared/{0}.master", "~/Views/{0}.master"};
ViewLocationFormats = new[]
{
"~/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx", "~/Views/Shared/{0}.ascx",
"~/Views/{1}/{0}.ascx"
};
PartialViewLocationFormats = new[] {"~/Views/{1}/{0}.ascx", "~/Views/Shared/{0}.ascx"};
}
protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
{
return new WebFormView(partialPath, "");
}
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
return new WebFormView(viewPath, masterPath);
}
}
Мой фильтр действий:
public class CanReturnModalView : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
// setup the request, view and data
HttpRequestBase request = filterContext.RequestContext.HttpContext.Request;
bool modal = false;
if (request.QueryString["modal"] != null)
modal = bool.Parse(request.QueryString["modal"]);
if (filterContext.Result is ViewResult)
{
ViewResult view = (ViewResult) (filterContext.Result);
// replace the view Master page file with Modal Masterpage
if (modal)
view.MasterName = "AdministrationModal";
filterContext.Result = view;
}
else if (filterContext.Result is RedirectToRouteResult)
{
RedirectToRouteResult redirect = (RedirectToRouteResult) filterContext.Result;
// append modal route value to the redirect result if modal was requested
if (modal)
redirect.RouteValues.Add("modal", true);
filterContext.Result = redirect;
}
}
}
Приведенный выше ViewEngine завершается неудачно при таких вызовах:
<% Html.RenderAction("Display", "MyController", new { zoneslug = "some-zone-slug" });%>
Я выполняю здесь следующее действие:
public ActionResult Display(string zoneslug)
{
WidgetZone zone;
if (!_repository.IsUniqueSlug(zoneslug))
zone = (WidgetZone) _repository.GetInstance(zoneslug);
else
{
// do something here
}
// WidgetZone used here is WidgetZone.ascx, so a partial
return View("WidgetZone", zone);
}
Я не могу использовать RenderPartial, потому что вы не можете отправитьНаправьте значения в RenderPartial так, как вы можете использовать RenderAction.Насколько мне известно, нет способа предоставить RouteValueDictionary RenderPartial () так же, как вы можете RenderAction ().