Другим способом решения этой проблемы является не полагаться на правильное возвращаемое значение с дисплея, а полагаться на разрешение ресурсов Android.
Создайте файл layouts.xml
в папках res/values-land
и res/values-port
со следующим содержимым:
res / values-land / layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">true</bool>
</resources>
res / values-port / layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">false</bool>
</resources>
Теперь в своем исходном коде вы можете получить доступ к текущей ориентации следующим образом:
context.getResources().getBoolean(R.bool.is_landscape)
Вы, вероятно, захотите использовать свойство TempData
, оно будет сохранено до следующего HTTP-запроса.
Почему бы не обработать логин через AJAX вместо полного сообщения? Вы можете легко предоставить статус, URL-адрес перенаправления и любые сообщения об ошибках через JSON.
public ActionResult Logon( string username, string password )
{
...
// Handle master page login
if (Request.IsAjaxRequest())
{
if (success)
{
return Json( new { Status = true, Url = Url.Action( "Index", "Home" ) } );
}
else
{
return Json( new { Status = false, Message = ... } );
}
}
else // handle login page logon or no javascript
{
if (success)
{
return RedirectToAction( "Index", "Home" );
}
else
{
ViewData["error"] = ...
return View("Logon");
}
}
}
На стороне клиента
$(function() {
$('#loginForm input[type=submit]').click( function() {
$('#loginError').html('');
$.ajax({
url: '<%= Url.Action("Logon","Account") %>',
dataType: 'json',
type: 'post',
data: function() { return $('#loginForm').serialize(); },
success: function(data,status) {
if (data.Status) {
location.href = data.Url;
}
else {
$('#loginError').html( data.Message );
}
}
});
return false;
});
});
Обычно для большинства веб-сайтов, когда пользователь не проходит аутентификацию (из-за пароля или чего-то подобного), он переходит на другую страницу, которая помогает пользователю (например, получить пароль или попросить пользователя зарегистрироваться), что редко остается на той же странице. Я думаю, вы можете еще раз подумать, что вам действительно нужна навигация, которую вы используете.
Хорошо, одно решение, если вы действительно хотите придерживаться своей модели, состоит в том, что вы можете прикрепить ошибку входа в систему к URL-адресу. Например, http://www.example.com/index.aspx?login_error=1 указывает, что возникает ошибка, и вы можете использовать BEGIN_REQUEST (или HTTP-модуль), чтобы зафиксировать это и сообщить состояние модели. об ошибке:
ModelState.AddModelError(...);
Кстати, Добавление ошибки модели на самом деле является более правильным способом информирования представления о любой ошибке, чем использование ViewState (это похоже на выдачу исключения и возвращение целого числа о результате выполнения в старые времена).
При использовании AJAX для входа в систему (как предложенный tvanfosson) вполне достижимо, и иногда он превосходит пользовательский интерфейс, классический полный пост по-прежнему незаменим (подумайте, что какой-то пользователь отключит javascript или даже на моем телефоне дампа WM6, который не поддерживает javascript).
Я запуталась. Разве
return View();
не возвращает вам только текущую страницу?
Итак, в вашем случае, когда не удается войти в систему, установите данные просмотра и вызовите return View ();
т.е.
if (!FailedLogin) {
//Go to success page
}else{
//Add error to View Data or use ModelState to add error
return View();
}
Используете ли вы [Авторизовать ] декоратор? Процесс входа в систему MVC автоматически запрашивает страницу входа и затем возвращает вас к действию контроллера, которое вы пытались выполнить. Сокращает количество перенаправлений.
Следующий пример, надеюсь, поможет вам в решении этой проблемы:
View.aspx
<%= Html.ValidationSummary("Login was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm()) { %>
<div>
<fieldset>
<legend>Account Information</legend>
<p>
<label for="username">Username:</label>
<%= Html.TextBox("username") %>
<%= Html.ValidationMessage("username") %>
</p>
<p>
<label for="password">Password:</label>
<%= Html.Password("password") %>
<%= Html.ValidationMessage("password") %>
</p>
<p>
<%= Html.CheckBox("rememberMe") %> <label class="inline" for="rememberMe">Remember me?</label>
</p>
<p>
<input type="submit" value="Log On" />
</p>
</fieldset>
</div>
<% } %>
AccountController.cs
private bool ValidateLogOn(string userName, string password)
{
if (String.IsNullOrEmpty(userName))
{
ModelState.AddModelError("username", "You must specify a username.");
}
if (String.IsNullOrEmpty(password))
{
ModelState.AddModelError("password", "You must specify a password.");
}
if (!MembershipService.ValidateUser(userName, password))
{
ModelState.AddModelError("_FORM", "The username or password provided is incorrect.");
}
return ModelState.IsValid;
}
Вы не сможете получить информацию, добавленную в ViewData после действия перенаправления. так что правильный подход - вернуть тот же View () и использовать ModelState для ошибок, о которых также упоминает «xandy».
Надеюсь, это даст вам фору при проверке формы.