2014-12-18 3 views
0

Iv сделал сайт в mvc и на navbar, я изменил код, который позволяет MVC показывать либо кнопку входа (если пользователь не вошел в систему), либо их имя (если они есть).Проблемы с моделью при использовании MVC

Когда пользователь нажимает кнопку входа, всплывающее окно покажет, чтобы позволить им войти в систему, и это нормально работает, как только пользователь регистрируется в имени пользователя.

Проблема возникает, когда я нажимаю имя пользователя на панели навигации. Он должен взять меня на страницу управления указательным, но вместо этого дает мне ошибку ниже:

Additional information: The model item passed into the dictionary is of type 
'Website.Models.IndexViewModel', but this dictionary requires a model item of type 
'Website.Models.LoginViewModel'. 

Я не могу за жизнь мне понять, Что пошло не так (я новичок в MVC внутривенные только что переехал из WebForms).

Я просто хочу, чтобы он перешел на страницу управления. Я включил код из файлов, которые, как я думаю, помогут людям отладить эту ошибку. Если вам нужны другие, пожалуйста, просто спросите.

_LoginPartial.cshtml

@using CoffeePixel.Models 
@using Microsoft.AspNet.Identity 
@model LoginViewModel 

@if (Request.IsAuthenticated) 
{ 
    using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" })) 
    { 
     @Html.AntiForgeryToken() 

     <ul class="nav navbar-nav navbar-right"> 
      <li> 
       <!-- add a clopasable pill type thing here to allow users to navigate the members area--> 
       @Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" }) 
      </li> 
      <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li> 
     </ul> 
    } 
} 
else 
{ 
    <style> 
     #topHead .signin-dd form button:after { 
      border: none !important; 
     } 

    </style> 
    <!-- SIGN IN --> 
    <div class="pull-right nav signin-dd"> 
     <a id="quick_sign_in" href="page-signin.html" data-toggle="dropdown"><i class="fa fa-users"></i><span class="hidden-xs"> Sign In</span></a> 
     <div class="dropdown-menu" role="menu" aria-labelledby="quick_sign_in" style="-moz-min-width: 200px; -ms-min-width: 200px; -o-min-width: 200px; -webkit-min-width: 200px; min-width: 200px;"> 

      <h4 class="text-center">Sign In</h4> 
      @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, 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"> 
        <div class="col-md-12"> 
         @Html.TextBoxFor(m => m.Email, new { @class = "form-control", placeholder = "Username or Email" }) 
         @Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" }) 
        </div> 
       </div> 

       <div class="input-group"> 

        <!-- password --> 
        @Html.PasswordFor(m => m.Password, new { @class = "form-control", placeholder = "Password" }) 
        @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" }) 

        <!-- submit button --> 
        <span class="input-group-btn"> 
         <button class="btn btn-primary" type="submit">Sign In</button> 
        </span> 

       </div> 

       <div class="checkbox"> 
        <!-- remmember --> 
        <label> 
         @Html.CheckBoxFor(m => m.RememberMe) Remember me &bull; <a href="@Url.Action("ForgotPassword", "Account")">Forgot password?</a> 
        </label> 
       </div> 
      } 

      <hr /> 
      <section id="socialLoginForm"> 
       @Html.Partial("~/Views/Account/_ExternalLoginsListPartial.cshtml", new ExternalLoginListViewModel { ReturnUrl = ViewBag.ReturnUrl }) 
      </section> 
      <p class="bottom-create-account"> 
       <a href="@Url.Action("Register", "Account")">Not Registered?</a> 
      </p> 
     </div> 
    </div> 
      <!-- /SIGN IN --> 
} 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

Layout.cshtml (Navbar фрагмент)

<!-- Top Bar --> 
    <header id="topHead"> 
     <div class="container"> 

      <!-- PHONE/EMAIL --> 
      <span class="quick-contact pull-left"> 
       <i class="fa fa-phone"></i> 1800-555-1234 &bull; 
       <a class="hidden-xs" href="mailto:[email protected]">[email protected]</a> 
      </span> 
      <!-- /PHONE/EMAIL --> 
      <!-- LANGUAGE --> 
      <div class="btn-group pull-right hidden-xs"> 
       <button class="dropdown-toggle language" type="button" data-toggle="dropdown"> 
        <img src="/Assets/images/flags/us.png" width="16" height="11" alt="EN Language" /> English <span class="caret"></span> 
       </button> 

       <ul class="dropdown-menu"> 
        <li> 
         <a href="#"> 
          <img src="/Assets/images/flags/us.png" width="16" height="11" alt="EN Language" /> [US] English 
         </a> 
        </li> 
        <li> 
         <a href="#"> 
          <img src="/Assets/images/flags/de.png" width="16" height="11" alt="DE Language" /> [DE] German 
         </a> 
        </li> 
        <li> 
         <a href="#"> 
          <img src="/Assets/images/flags/fr.png" width="16" height="11" alt="FR Language" /> [FR] French 
         </a> 
        </li> 
        <li> 
         <a href="#"> 
          <img src="/Assets/images/flags/ru.png" width="16" height="11" alt="RU Language" /> [RU] Russian 
         </a> 
        </li> 
       </ul> 
      </div> 
      <!-- /LANGUAGE --> 

      <!-- CART MOBILE BUTTON --> 
      <a class="pull-right" id="btn-mobile-quick-cart" href="shop-cart.html"><i class="fa fa-shopping-cart"></i></a> 
      <!-- CART MOBILE BUTTON --> 
      <!-- LINKS --> 
      @Html.Partial("_LoginPartial") 
      <div class="pull-right nav hidden-xs"> 
       <a href="@Url.Action("About", "Home")"><i class="fa fa-angle-right"></i> About</a> 
       <a href="@Url.Action("Contact", "Home")"><i class="fa fa-angle-right"></i> Contact</a> 
      </div> 
      <!-- /LINKS --> 

     </div> 
    </header> 
    <!-- /Top Bar --> 

Контроллер

// 
     // GET: /Manage/Index 
     public async Task<ActionResult> Index(ManageMessageId? message) 
     { 
      ViewBag.StatusMessage = 
       message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed." 
       : message == ManageMessageId.SetPasswordSuccess ? "Your password has been set." 
       : message == ManageMessageId.SetTwoFactorSuccess ? "Your two-factor authentication provider has been set." 
       : message == ManageMessageId.Error ? "An error has occurred." 
       : message == ManageMessageId.AddPhoneSuccess ? "Your phone number was added." 
       : message == ManageMessageId.RemovePhoneSuccess ? "Your phone number was removed." 
       : ""; 

      var model = new IndexViewModel 
      { 
       HasPassword = HasPassword(), 
       PhoneNumber = await UserManager.GetPhoneNumberAsync(User.Identity.GetUserId()), 
       TwoFactor = await UserManager.GetTwoFactorEnabledAsync(User.Identity.GetUserId()), 
       Logins = await UserManager.GetLoginsAsync(User.Identity.GetUserId()), 
       BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(User.Identity.GetUserId()) 
      }; 
      return View(model); 
     } 
+1

Вы смешиваете свою логику и трудно понять, что именно вы пытаетесь сделать с этим и следовать своему коду. Условная логика должна быть в меню, а не на странице входа в систему, но вам нужно передать модель в частичный '@ Html.Partial (« _ LoginPartial », новый LoginViewModel)», иначе пройденная модель является моделью в главном представлении , –

+0

спасибо! перемещение логики в макет! – DeveloperDevine

ответ

0

Проблема заключается в основном, вероятно, во втором зрения , Вы должны убедиться, что модель управляющей индексной страницы имеет тип CoffeePixel.Models.IndexViewModel.

Я предполагаю, что у вас есть в верхней части страницы:

@model LoginViewModel 

Если да заменить его:

@model IndexViewModel 
+0

Это не сработает, потому что я должен использовать loginviewmodel, чтобы пользователи могли войти в систему. – DeveloperDevine

+1

Можете ли вы включить метод Index в управляющем контроллере, который вы вызываете, и верхнюю часть окна «Управление индексом», чтобы я мог помочь. –

1

Вы можете попробовать использовать IndexViewModel как свойство в LoginViewModel?

Смежные вопросы