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

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

کاربر سایت

بهاره فیضی

عضویت از 1392/11/03

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

  • شنبه 1 مهر 1396
  • 13:16
تشکر میکنم

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

من یک 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);
            }

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

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

پاسخ های این پرسش

تعداد پاسخ ها : 4 پاسخ
کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • شنبه 1 مهر 1396
  • 13:25

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

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

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

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

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

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

کاربر سایت

بهاره فیضی

عضویت از 1392/11/03

  • شنبه 1 مهر 1396
  • 14:49

سلام

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

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

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

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

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

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

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

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

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

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • شنبه 1 مهر 1396
  • 17:26

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

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

کاربر سایت

بهاره فیضی

عضویت از 1392/11/03

  • شنبه 1 مهر 1396
  • 20:30

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

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

مشکل حل شد.

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)