Этот проект позволяет клиентам страховать различные виды предметов риска (инвалидная коляска / транспортное средство / скутер). Для каждого элемента риска был создан отдельный маршрут (поскольку для каждого типа задаются разные вопросы). В настоящее время можно выбрать элемент риска, и клиент затем заполняет всю свою информацию, получает предложение и затем вводит политику (оплата с помощью кредитной / дебетовой карты). Это приложение было создано, чтобы застраховать только один элемент риска для каждой политики. Все это прекрасно работает, если клиент хочет застраховать только один элемент риска. Если клиент затем выбирает страховать другой (или другой) элемент риска, проблема сохраняется, поскольку браузер теперь сохраняет сеанс предыдущего запроса.
Мне нужно найти способ разрешить другой (или то же самое) элементы риска, которые должны быть процитированы и введены без вмешательства в предыдущую политику (оплату). Когда клиент выбирает элемент риска (с другого веб-сайта), он переходит к первой начальной точке элемента риска, открывая другую вкладку. Можно ли поддерживать сеанс на вкладке?
Вот что было сделано ...
Регистрация маршрутов (файл, на который ссылается Global.asax)
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Scooter",
url: "Scooter/{action}/{id}",
defaults: new { controller = "Mobility", action = "All", id = UrlParameter.Optional}
);
routes.MapRoute(
name: "Wheelchair",
url: "Wheelchair/{action}/{id}",
defaults: new { controller = "Mobility", action = "All", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "ComingSoon", id = UrlParameter.Optional }
);
}
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
BundleMobileConfig.RegisterBundles(BundleTable.Bundles);
//Add a required data annotation that relies on the value of another property to set the field as required
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredIfAttribute),typeof(RequiredAttributeAdapter));
}
Создание сеансов:
#region Helpers
private static T GetSession<T>(string key)
{
object value = HttpContext.Current.Session[key];
if (value == null)
return default(T);
else
return ((T)value);
}
private static void SetSession(string key, object value)
{
HttpContext.Current.Session[key] = value;
}
public static void ClearQuoteSession()
{
HttpContext.Current.Session.Clear();
HttpContext.Current.Session.Abandon();
}
public static string GenerateBuyMapCode()
{
var holderKey = Guid.NewGuid();
var polMapCode = "BB-" + holderKey;
return polMapCode.Trim();
}
Следующий метод позволяет создавать сеансы с помощью cook ie.
public static PolicyBase CreateNewPolicyBase(Enums.RiskType type)
{
var polBase = new PolicyBase();
polBase.Insured = new InsuredViewModel();
polBase.RiskMeItems = new List<RiskItemMeModel>();
*Irrelevant code removed*
polBase.SessionKey = GenerateBuyMapCode();
polBase.BrowserSession = HttpContext.Current.Session;
*Irrelevant code removed*
return polBase;
}
#region Session INIT
public static string QuoteKey
{
get { return GetSession<string>("QuoteKey"); }
set { SetSession("QuoteKey", value); }
}
public static AusEnums.RiskType RiskType
{
get { return GetSession<AusEnums.RiskType>("RiskType"); }
set { SetSession("RiskType", value); }
}
public static AusEnums.QuoteArea Area
{
get { return GetSession<AusEnums.QuoteArea>("QuoteArea"); }
set { SetSession("QuoteArea", value); }
}
public static PolicyBase PolicyBase
{
get { return GetSession<PolicyBase>("PolicyBase"); }
set { SetSession("PolicyBase", value); }
}
public static SSMultiPremium MultiPremium
{
get { return GetSession<SSMultiPremium>("MultiPremium"); }
set { SetSession("MultiPremium", value); }
}
Web.config
<sessionState mode="InProc" cookieless="UseDeviceProfile" regenerateExpiredSessionId="true" timeout="20" />
Элементы риска мобильности и моторного риска имеют различный старт баллы, следующее является отправной точкой мобильности (клиент следует принципу)
[HttpGet]
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]
public ActionResult Insured()
{
//We need to determine the direction
SessionHelper.GetRoutePath((Route)ControllerContext.RouteData.Route);
var polBase = SessionHelper.PolicyBase;
HttpCookie userCookie = new HttpCookie("BBCookieCheck");
userCookie["Name"] = "BB";
userCookie.Expires.AddDays(1); // cookie will expire after 1 days
Response.Cookies.Add(userCookie);
var viewModel = new InsuredViewModel();
if (polBase != null)
{
viewModel = polBase.Insured;
viewModel.Title = polBase.Insured.Title;
}
viewModel.riskType = SessionHelper.RiskType;
*Irrelevant code removed*
return View(viewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Insured(InsuredViewModel model)
{
*Irrelevant code removed*
//create a new quote object and save the relevant fields
var polBase = SessionHelper.PolicyBase;
if (model.Id == 0)
{
polBase = SessionHelper.CreateNewPolicyBase(model.riskType);
*Irrelevant code removed*
}
}