Конфликт модели возникает, поскольку он говорит, что ViewDataDictionary передается модель @ модель1, но требует модель типа @ модель2 asp.net Идентичность - PullRequest
1 голос
/ 01 июня 2019

Возникает конфликт, связанный с 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; }
     }
...