У меня есть форма входа в систему, которая отображается на всех страницах моего сайта mvc и просит пользователя войти в систему или показывает приветственное сообщение, если они уже вошли в систему вместе с различными данными учетной записи (логотип компании и т. Д.), У меня нет сама страница входа в систему все вход в систему обрабатывается через этот «виджет»
Для реализации этого у меня есть следующее
В моем основном макете
<div id="top_right">
@{ Html.Partial("_LogOnPartial");}
</div>
_LogOnPartial.cshtml
@if (Request.IsAuthenticated)
{
// TODO: show company logo
Html.RenderAction("Details", "Account");
}
else
{
Html.RenderAction("LogOn", "Account");
}
Контроллер аккаунта
public class AccountController : Controller
{
public PartialViewResult LogOn()
{
return PartialView();
}
[HttpPost]
public ActionResult LogOn(LogOnModel userDetails, string returnUrl)
{
//TODO: validate user here
if(ModelState.IsValid)
{
if(Membership.ValidateUser(userDetails.UserName, userDetails.Password))
{
FormsAuthentication.SetAuthCookie(userDetails.UserName, userDetails.RememberMe);
return Redirect(returnUrl);
}
else
{
ModelState.AddModelError("", "The username or password provided was incorrect");
}
}
return PartialView(userDetails);
}
public PartialViewResult Details()
{
//TODO: query membership for user information
var user = new UserDetailsViewModel();
return PartialView(user);
}
}
}
LogOn.cshtml
@model LogOnModel
<div id="login">
@Html.ValidationSummary()
<h2>Start by Loggin in</h2>
@using (Html.BeginForm("LogOn", "Account"))
{
@Html.Hidden("returnUrl", Request.Url.PathAndQuery)
<table width="100%" border="0" cellspacing="0" cellpadding="5">
<tr>
<td>
<span class="bluey">Username:</span><br />
@Html.TextBoxFor(m => m.UserName,new {tabindex="1", Class = "field"})
@Html.ValidationMessageFor(m => m.UserName, "*")
</td>
<td>
<span class="bluey">Password:</span><br />
@Html.TextBoxFor(m => m.Password, new {tabindex = "2", Class="field"})
@Html.ValidationMessageFor(m=> m.Password, "*")
</td>
</tr>
<tr>
<td>
<input name="login" type="submit" value="Submit" class="input_btn" tabindex="3" />
</td>
<td>@Html.CheckBoxFor(m=>m.RememberMe) @Html.LabelFor(m=> m.RememberMe) <span class="bluey"> | </span> @Html.ActionLink("Forgot Password?", "Password", "User")></td>
</tr>
</table>
}
</div>
Я прочитал несколько сообщений, и, похоже, мне нужно будет изменить свой LogOn.cshtml, чтобы использовать jquery для создания сообщения, с помощью метода действия / Account / LogOn, а затем обновить html сообщения об успехе или неудаче div. .
Я видел, как это было сделано с помощью пользовательского RenderPartialViewToString , но кто-то также рекомендовал, чтобы было достаточно возврата Partial из Action, и это будет правильно обрабатываться через код jquery, заменяя div (или любой другой элемент) с новым html.
Я также видел пример, возвращающий Json (модель), но я не уверен, вернет ли это реальное представление или только данные модели, закодированные как json
Являются ли оба эти подхода жизнеспособными или есть лучший способ сделать это?