ASP.net MVC4: à l'Aide d'un autre modèle dans une vue partielle?
Je suis juste d'apprentissage ASP.net MVC donc excusez-moi si je suis mal à expliquer mon problème.
Est-il possible d'utiliser un autre modèle dans une vue partielle de ce qui est hérité de la vue?
Mon point de vue Index
hérite actuellement LoginModel
, qui traite avec l'autorisation des utilisateurs. Une fois qu'un utilisateur est autorisé, je veux le Index
pour afficher la liste des todos
de l'utilisateur. todos
sont récupérées via LINQ.
Donc ma vue partielle veut hériter System.Web.Mvc.ViewPage<IEnumerable<todo_moble_oauth.Models.todo>>
, mais j'obtiens une erreur lorsque j'utilise ceci: "Le modèle de l'élément passé dans le dictionnaire est de type
System.Data.Linq.DataQuery`1[todo_moble_oauth.Models.todo]', but this dictionary requires a model item of type 'todo_moble_oauth.Models.LoginModel'
C'est mon Index
vue
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<todo_moble_oauth.Models.LoginModel>" %>
<section id="loginForm">
<% if (Request.IsAuthenticated) { %>
<% Html.RenderPartial("_ListTodos"); %>
<% } else { %>
<h1>Todo Mobile</h1>
<blockquote>Easily store your list of todos using this simple mobile application</blockquote>
<% using (Html.BeginForm()) { %>
<%: Html.AntiForgeryToken() %>
<%: Html.ValidationSummary(true) %>
<%: Html.LabelFor(m => m.UserName) %>
<p class="validation"><%: Html.ValidationMessageFor(m => m.UserName) %></p>
<%: Html.TextBoxFor(m => m.UserName) %>
<%: Html.LabelFor(m => m.Password) %>
<p class="validation"><%: Html.ValidationMessageFor(m => m.Password) %></p>
<%: Html.PasswordFor(m => m.Password) %>
<label class="checkbox" for="RememberMe">
<%: Html.CheckBoxFor(m => m.RememberMe) %>
Remember Me?
</label>
<input type="submit" value="Login" />
<% } %>
<% } %>
</section>
Ma vue partielle _ListTodos
est comme suit:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<IEnumerable<todo_moble_oauth.Models.todo>>" %>
<% foreach (var item in Model) { %>
<%: Html.DisplayFor(modelItem => item.title) %>
<%: Html.DisplayFor(modelItem => item.description) %>
<% } %>
Mon LoginModel
est la suivante:
public class LoginModel
{
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
La HomeController
Index()
méthode:
[AllowAnonymous]
public ActionResult Index()
{
//if user is logged in, show todo list
if (Request.IsAuthenticated)
{
//var currentUser = Membership.GetUser().ProviderUserKey;
todosDataContext objLinq = new todosDataContext();
var todos = objLinq.todos.Select(x => x);
return View(todos);
}
return View();
}
Toute aide est grandement appréciée, merci.
OriginalL'auteur Neil | 2013-05-22
Vous devez vous connecter pour publier un commentaire.
Sûr que vous pouvez faire:
Passer le
userTodos
en tant que paramètre à la Partielle de l'aide.L'erreur que vous obtenez est parce que vous êtes de retour d'une liste de tâches à la page d'Index/affichage avec
return View(todos);
à l'intérieur de laIndex
méthode d'action. La page d'Index a besoin d'unLoginModel
objet au lieu d'unIEnumerable
de todo objets.Pour résoudre ce problème, vous devez modifier la façon dont vous êtes de passage le
todos
. Depuis votreIndex
page reçoit unLoginModel
, vous pouvez ajouter unTodos
propriété de cette classe comme ceci:et puis, modifier votre Index de la méthode d'action:
Dans la vue, ce faire:
<% Html.Partial("_ListTodos", Model.Todos); %>
à<% Html.RenderPartial("_ListTodos", Model.Todos); %>
pour le faire fonctionner, mais tout ce qui est de l'or maintenant, merci!J'ai eu une situation similaire, mais mon modèle de structure est un peu différente et ne nécessite pas de modifier depuis que j'ai seulement besoin de créer une nouvelle instance du modèle. Pour mes besoins, j'ai utilisé cette ligne de code (la Syntaxe Razor): @Html.Partielle("boîtes de dialogue/_partial vue", nouvelle MyObjectModel())
OriginalL'auteur Leniel Maccaferri