Общий класс для идентификации информации о текущем сеансе в приложении ASP.Net MVC - PullRequest
0 голосов
/ 27 августа 2018

Я занимаюсь разработкой простого пользовательского веб-приложения на основе ролей с использованием ASP.Net MVC. В своем действии по входу в систему я создаю сеанс профиля, как показано ниже:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
    using (HostingEnvironment.Impersonate())
    {
        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                var employeeProfile = AccountBal.Instance.GetEmployee(loginId);
                Session["Profile"] = employeeProfile;
                FormsAuthentication.SetAuthCookie(model.UserName, true);
            }
        }
        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", @"The user name or password provided is incorrect.");
        return View(model);
    }
}

И я проверяюэто или использование этого сеанса во всех действиях контроллера, как показано ниже:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateOrEdit(MyModel model)
{
    var employee = (Employee) Session["Profile"];
    if (employee == null) 
       return RedirectToAction("Login", "Account");

    if (ModelState.IsValid)
    {
        // Functionality goes here....
    }
}   

Можно ли как-нибудь переместить этот фрагмент кода проверки сеанса в базовый класс или в централизованный класс?так что мне не нужно проверять его каждый раз в действиях контроллера, вместо этого я получу прямой доступ к свойствам

скажем,

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateOrEdit(MyModel model)
{
    var employee = _profileBase.GetCurrentProfile();
    if (employee == null) 
       return RedirectToAction("Login", "Account");

    if (ModelState.IsValid)
    {
        // Functionality goes here....
    }
}  

1 Ответ

0 голосов
/ 27 августа 2018

Создайте базовый контроллер, который содержит ваш метод GetCurrentProfile для извлечения текущего профиля пользователя, например

public class BaseController : Controller
{
    public Employee GetCurrentProfile()
    {
        return (Employee)Session["Profile"];
    }

    public bool SetCurrentProfile(Employee emp)
    {
        Session["Profile"] = emp;
        return true;
    }
}

, и наследуйте желаемый контроллер с указанным выше BaseController и получите доступ к вашему GetCurrentProfile методу, как показано ниже

public class HomeController : BaseController
{
    public ActionResult SetProfile()
    {
        var emp = new Employee { ID = 1, Name = "Abc", Mobile = "123" };

        //Set your profile here
        if (SetCurrentProfile(emp))
        {
            //Do code after set employee profile
        }
        return View();
    }

    public ActionResult GetProfile()
    {
        //Get your profile here
        var employee = GetCurrentProfile();

        return View();
    }
}

GetCurrentProfile и SetCurrentProfile напрямую доступны для вашего желаемого контроллера, поскольку мы напрямую наследуем его от BaseController.

Вы можете использовать try/catch в приведенном выше фрагменте кода.

Попробуй, может, тебе это поможет

...