如果该位置尚未存储,则可以使用操作筛选器检查会话中的值并重定向到视图。一旦被捕获,您可以重定向回原始视图。
是这样的:任何需要的地方在一个控制器/动作
public class CheckLocationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var location = filterContext.HttpContext.Session["Location"];
if (string.IsNullOrWhiteSpace(location))
{
// store the requested URL for use once location has been chosen
filterContext.Controller.TempData["ReturnToUrl"] = filterContext.HttpContext.Request.Url;
// redirect to location choice view
filterContext.Result = new RedirectResult(VirtualPathUtility.ToAbsolute("~/Location/Choose"));
}
}
}
然后使用这个属性:
public class SomeController : Controller
{
[CheckLocation]
public ActionResult Index()
{
// location has been checked so continue
return View();
}
}
这意味着该位置选择视图将呈现(冗余)多次。如果有关联的数据库查询(检索位置列表),这也会增加开销。 – MarkG
另外,可以应用操作过滤器来查看操作或控制器或全局。 – MarkG
视图将有机会渲染很多次,是的。但是,它会检查模型值,看它是否真的需要显示选择UI。此外,除非Session变量不存在,否则不会有数据库命中。例如,检查Session var,如果不存在,则敲入DB,存储在Session中,返回模型。如果Session var存在,只需设置模型值并返回;没有数据库命中。 – ventaur