مرجع تخصصی برنامه نویسان

بزرگترین انجمن برنامه نویسان فارسی زبان

صفحه لاگین جداگانه برای Admin Area

شنبه, 01 مهر 1396 13:16

صفحه لاگین جداگانه برای Admin Area

سلام، سوال توضیحات طولانیه، ممنون می شم حوصله کنید و بخونید.

من یک Area ایجاد کردم به اسم Administrator و می خوام ادمین از طریق فرضا آدرس ذیل وارد صفحه مدیریتی بشه

mysite.com/Administrator

که با استفاده از لینک ذیل موفق به این کار شدم

https://stackoverflow.com/questions/8896381/multiple-forms-login-pages

یعنی یک Home Controller با کدهای ذیل در ناحیه ادمین ایجاد کردم، که اکشن Index حکم صفحه لاگین رو داره

 public class HomeController : Controller
    {
        
        // GET: Administrator/Home
        public ActionResult Index(string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;
            return View();
        }
        

        [CustomAuthorize(Roles = "Administrator")]
        
        public ActionResult Admin()
        {
            return View();
        }
    }

این هم کدهای ویوی Index (در واقع همون کدهای Login.cshtml پیش فرض رو در این ویو کپی کردم با این تفاوت که یک area=''" به قسمت BeginForm اضافه کردم که ویو بتونه از کنترلر Account و اکشن Login پیش فرض استفاده کنه.

@model MvcApiAngularShop.Models.LoginViewModel
@{
    ViewBag.Title = "Index";
    Layout = null;
}

<h2>Index</h2>

<div class="row">
    <div class="col-md-8">
        <section id="loginForm">
            @using (Html.BeginForm("Login", "Account", new {ReturnUrl = ViewBag.ReturnUrl,area="" }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
            {
                @Html.AntiForgeryToken()
                <h4>Use a local account to log in.</h4>
                <hr />
                @Html.ValidationSummary(true, "", new { @class = "text-danger" })
                <div class="form-group">
                    @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" })
                    </div>
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.PasswordFor(m => m.Password, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <div class="checkbox">
                            @Html.CheckBoxFor(m => m.RememberMe)
                            @Html.LabelFor(m => m.RememberMe)
                        </div>
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <input type="submit" value="Log in" class="btn btn-default" />
                    </div>
                </div>
                <p>
                    @Html.ActionLink("Register as a new user", "Register")
                </p>
                @* Enable this once you have account confirmation enabled for password reset functionality
                    <p>
                        @Html.ActionLink("Forgot your password?", "ForgotPassword")
                    </p>*@
            }
        </section>
    </div>
   
</div>

ولی یه مشکلی که هست اینه که وقتی کاربر اطلاعات اشتباه وارد می کنه صفحه لاگین پیش فرض بهش نمایش داده میشه که دلیل این هم کد ذیل هست که در اکشن Login در کنترلر Account وجود داره

if (!ModelState.IsValid)
            {
                return View(model);
            }

حالا مسئله اینه که در صورت ولید نبودن اطلاعات کاربری چطور Index View ای که در Adminastrator Area هست و حکم صفحه لاگین رو داره، رو return View کنم؟

من سعی کردم از این کد استفاده کنم ولی جواب نداد

 if (!ModelState.IsValid)
            {
                
                return View("~/Administrator/Views/Home/Index.cshtml", model);
            }

ممنون از وقتی که گذاشتید

سوال بعدی م هم اینه که حالا اگه این مشکل حل بشه، اصلا این روش، روش درستی هست یا راه کار دیگه ای رو پیشنهاد می دید برای جدا کردن صفحه لوگین ادمین؟

شنبه, 01 مهر 1396 13:25

کاری اشتباهی است دلیلی نداره وقتی مدل ارسالی معتبر نیست بره به ادمین.

برای انقال به یه صفحه دیگه باید redirect کنید:

return RedirectToAction("Index", "Home", new {area = "Administrator"});

حال اگر مدل معتبر نبود چگونه آن را به کاربر مطرح کنیم.

            ModelState.AddModelError("Email","Your Email is not valid");

پارامتر اول مشخص می کند که متن اعتبار سنجی برای کدام element است.

شنبه, 01 مهر 1396 14:49

سلام

به نظرم متوجه منظورم نشدید

نه من قصد ندارم وقتی مدل ارسالی معتبر نیست به ادمین برم، بلکه می خوام در همون صفحه لوگین که اینجا Index.cshtml هست باقی بمونم.

می خوام در همون ویوی لوگین مختص ادمین باقی بمونم ولی در حال حاضر به صفحه لوگین پیش فرض فرستاده میشم

بزارید این طوری بگم

آین آدرس صفحه لوگین در Administrator Area هست

http://localhost:39485/Administrator?ReturnUrl=%2Fadministrator%2Fhome%2Fadmin

حالا وقتی کاربر اطلاعات کاربری غلط وارد می کنه آدرس به شکل زیر تغییر پیدا می کنه

http://localhost:39485/Account/Login?ReturnUrl=%2Fadministrator%2Fhome%2Fadmin

ولی من می خوام آدرس تغییر پیدا نکنه

شنبه, 01 مهر 1396 17:26

داره از Web.Config قسمت LoginUrl میخونه

باید خودتون این موضوع رو کنترل کنید و از صفت Authorize استفاده نکنید و چک کنید اگر لاگین نبود کاربر رو دوباره به صفحه لاگین ادمین هدایت کنید

شنبه, 01 مهر 1396 20:30

کدهای اکشن Login موجود در کنترلر Account رو به Home Controller منطقه ادمین منتقل کردم، فقط نام Login به Index تغییر یافت و ویو Index رو هم به صورت ذیل تغییر دادم

 @using (Html.BeginForm("Index", "Home",

مشکل حل شد.

ارسال پاسخ برای این تاپیک

ارسال پاسخ مخصوص اعضا سایت می باشد ! میتوانید با حساب کاربری خود وارد سایت شده یا ثبت نام کنید