Возникает конфликт, связанный с DataViewDictionary, который требует модель другого типа во время передачи модели другого типа.
Я пытался избежать этого конфликта, используя ViewBags для получения данных от контроллеров, но на самом деле хитрость не сработала при передаче данных обратно в контроллер с использованием запросов HttpPost.Я также пытался использовать подход Common Model для решения этой проблемы, но безрезультатно
[AllowAnonymous]
public IActionResult Login(string returnUrl)
{
Login login = new Login();
login.ReturnUrl = returnUrl;
return View(login);
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(Login login )
{
if (ModelState.IsValid)
{
ApplicationUser appUser = await userManager.FindByEmailAsync(login.Email);
if (appUser != null)
{
await signInManager.SignOutAsync();
Microsoft.AspNetCore.Identity.SignInResult result = await signInManager.PasswordSignInAsync(appUser, login.Password, false, false);
if (result.Succeeded)
{
if(User.IsInRole("Administrator") || User.IsInRole("Editor"))
{
return RedirectToAction("Dashboard", "Admin");
}
else
{
return RedirectToAction("Index", "Home");
}
}
}
ModelState.AddModelError(nameof(login.Email), "Login Failed: Invalid Email or password");
}
return View(login);
}
Startup.cs код выглядит следующим образом:
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.ConfigureApplicationCookie(options =>
{
options.AccessDeniedPath = "/Account/AccessDenied";
options.Cookie.Name = "Cookie";
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(720);
options.LoginPath = "/Home/";
options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
options.SlidingExpiration = true;
});
Ожидаемый результат должен войти в системуПользователь успешно и то же самое для зарегистрированного пользователя.Но следующее исключение выдается, когда я нажимаю кнопку входа в систему.
InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'PixageStudioWeb.Models.Login', but this ViewDataDictionary instance requires a model item of type 'PixageStudioWeb.Models.Register'.
У меня есть несколько частичных представлений, некоторые из которых являются _LoginPartial и _RegisterPartial в файле индекса. Я использовал общую модель с именем Multimodel, код которой выглядит следующим образом.
@model MultiModel
<div id="form" style="min-width:375px;">
<div class="text-danger" asp-validation-summary="All"></div>
<form asp-action="Login" asp-controller="Account" method="post"
style="margin:5px 5px 5px 5px">
<input type="hidden" asp-for="login.ReturnUrl" />
<ul>
<li>
<label asp-for="login.Email"></label>
<input asp-for="login.Email" class="col-md-6" />
</li>
<li>
<label asp-for="login.Password"></label>
<input type="password" asp-for="login.Password" class="col-md-6" />
</li>
<li>
<button type="submit">Login</button>
<label>
<input type="checkbox" checked="checked" name="remember">
Remember me
</label>
</li>
<li>
<button type="button"
onclick="document.getElementById('id01').style.display='none'"
class="cancelbtn">Cancel</button>
<span class="psw">Forgot <a href="#">password?</a></span>
</li>
</ul>
</form>
</div>
Мультимодельный класс
public partial class MultiModel
{
public IEnumerable<Category> categories { get; set; }
public IEnumerable<ImagePool> images { get; set; }
public Login login { get; set; }
public Register register { get; set; }
}