2012-04-13 8 views
2

Das Modellelement, das an das Wörterbuch übergeben wurde, ist vom Typ 'System.Collections.Generic.List`1 [PM.Models.Product]', aber für dieses Wörterbuch ist ein Modellelement vom Typ erforderlich. ' PM.Models.LogOnModel '.Konflikt mit Modellen bei Teilansicht und LogOn

PROBLEM:

Ошибка сервера в приложении '/'. 
The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[PM.Models.Product]', but this dictionary requires a model item of type 'PM.Models.LogOnModel'. 
Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода. 

Сведения об исключении: System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[PM.Models.Product]', but this dictionary requires a model item of type 'PM.Models.LogOnModel'. 

Ошибка источника: 

Строка 1: @using PM.Models 
Строка 2: @{PM.Models.LogOnModel LOM=new LogOnModel();} 
Строка 3: @RenderPage("../Account/LogOn.cshtml"); 

Ich versuche, ein PartialView zu verwenden auf der Hauptseite zu verwenden, um Benutzerfeld für Login und Passwort anzuzeigen einloggen bei Site.And einer anderen Teilansicht für gegenwärtig Benutzerliste der Produkte vor Ort. Aber ich habe ein Problem, bitte hilf mir mit ihr.

ist dies Beispiel meiner Anmeldeseite

@model PM.Models.LogOnModel 
@{ 
    ViewBag.Title = "Log On"; 
} 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 
<script type="text/javascript" language="javascript"> 
    var UserNameTextBox = document.getElementById("login"); 
    UserNameTextBox.textContent = UserNameTextBox.textContent + "123"; 
</script> 


<link href="../../Content/themes/our/Style.css" rel="stylesheet" type="text/css" /> 

@using (Html.BeginForm("LogOn", "Account")) 
{  
    <div id="login" > 
    @Html.TextBoxFor(m => m.UserName, new { @class = "inputLogin" }) 
    @Html.PasswordFor(m => m.Password, new { @class = "inputLogin" }) 
    @Html.CheckBoxFor(m => m.RememberMe) 
    @Html.LabelFor(m => m.RememberMe, new { @class = "rememberText" }) 
    <div id="ErrorMessage"> 
    @Html.ValidationSummary(true, "Авторизоваться не удалось, проверьте введенные данные.") 
    </div> 

    <div id="loginButtons"> 
      @Html.ActionLink(" ", "Register", "Account", routeValues: null, htmlAttributes: new { id = "registerLink", @class = "register" }) 
      <input type="submit" value="Войти" id="loginButton" title="Войти" /> 
     </div> 
    <div id="loginWith"> 
     Войти через: &nbsp;&nbsp;&nbsp; 
     <a href="" style="text-decoration:none;"><img alt="" class="SocialIcon" src="../../Content/img/VKicon.PNG" />&nbsp;&nbsp;&nbsp;&nbsp;</a> 
     <a href="" style="text-decoration:none"><img alt="" class="SocialIcon" src="../../Content/img/FBIcon.PNG" />&nbsp;&nbsp;&nbsp;</a> 
     <a href="" style="text-decoration:none"><img alt="" class="SocialIcon" src="../../Content/img/TwitterIcon.PNG" /></a> 
    </div> 
    </div> 

} 

dieses Beispiel meiner Suchseite ist, die ein anderes Modell erforderlich, die Anmelde

@model IEnumerable<PM.Models.Product> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.Name) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Description) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Type) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Image) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Partition) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Description) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Type) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Image) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Partition) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.Id }) | 
      @Html.ActionLink("Details", "Details", new { id=item.Id }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.Id }) 
     </td> 
    </tr> 
} 

</table> 

Konto Conroller

[AllowAnonymous] 
     public ActionResult LogOn() 
     { 
      string actionName = ControllerContext.RouteData.GetRequiredString("action"); 
      ViewBag.FormAction = actionName; 
      return View(); 
     } 


     // 
     // POST: /Account/LogOn 

     [AllowAnonymous] 
     [HttpPost] 
     public ActionResult LogOn(LogOnModel model, string returnUrl) 
     { 
      if (ModelState.IsValid) 
      { 
       if (System.Web.Security.Membership.ValidateUser(model.UserName, model.Password)) 
       { 
        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
        if (Url.IsLocalUrl(returnUrl)) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         if (Request.UrlReferrer != null) 
          return Redirect(Request.UrlReferrer.AbsoluteUri); 
         else 
         { 
          return RedirectToAction("Index","Home"); 
         } 
        } 
       } 
       else 
       { 
        ModelState.AddModelError("", "The user name or password provided is incorrect."); 
       } 
      } 

      // If we got this far, something failed, redisplay form 
      return RedirectToAction("Index", "Home", new { login = "incorrect" }); 
     } 

Steuerung, die Arbeit mit Suchansicht

So
[HttpGet] 
    public ActionResult Search(string KeyWord) 
    { 
     DataManager dm = new DataManager(); 
     List<Product> sended = dm.FindProducts(KeyWord); 
     return View(sended); 
    } 
+0

Können Sie die entsprechenden Controller-Aktionen anzeigen? –

+0

ja, ich füge sie erst vor ein paar Minuten hinzu. –

+0

In Ihrem Beispiel haben Sie einen Controller, als Sie eine stark typisierte Ansicht erstellt haben und dann ein anderes Modell an eine stark typisierte Ansicht übergeben, die nicht erkannt wird und daher erhalten Sie diesen Fehler –

Antwort

2

Sie haben zwei Teilansichten LogOn.cshtml und Search.cshtml stark typisierte jeweils LogOnModel und IEnumerable<Product>. Dies bedeutet, dass Sie die korrekten Modelltypen beim Rendern dieser Teiltafeln übergeben müssen. Wenn Sie beispielsweise nur Html.Partial("somePartial") verwenden, ohne ein Modell als zweites Argument anzugeben, wird das übergeordnete Modell übergeben. Wenn Sie ein Modell angeben wollte könnten Sie wie folgt vorgehen:

@{ 
    var logonModel = new LogOnModel(); 
} 
@Html.Partial("~/Views/Account/LogOn.cshtml", logonModel) 

oder man konnte den Html.Action Helfer verwenden, die statt direkt eine Teilansicht einschließlich ermöglicht es Ihnen, eine Controller-Aktion aufzurufen, die eine teilweise zurück. Es wird jedoch keine separate HTTP-Anfrage vom Client gesendet. Alles geschieht in der gleichen Anfrage:

@Html.Action("LogOn", "Account") 

und jetzt Ihre Logon-Methode aufgerufen wird und das richtige Modell passieren muss:

public ActionResult LogOn() 
{ 
    var model = new LogOnModel(); 
    return PartialView(model); 
} 

[HttpPost] 
public ActionResult LogOn(LogOnModel model, string returnUrl) 
{ 
    ... 
} 

Das gleiche steht gilt für die Suche Teil:

@Html.Action("Search", "SomeControllerContainingTheSearchAction") 
+0

Vielen Dank es ist wirklich Arbeit =))))) –

Verwandte Themen