8

私はASP.net MVCを学んでいるので、私の問題を説明するのが悪ければ、私に同行してください。ASP.net MVC4:部分ビューで別のモデルを使用していますか?

ビュー内で継承されているモデルとは異なるモデルを部分ビューで使用することはできますか?

私の見解Indexは現在、ユーザーの承認を扱っているLoginModelを継承しています。ユーザーが承認されると、Indexにはユーザーのtodosのリストが表示されます。 todosはLINQ経由で取得されます。

だから私の部分図でSystem.Web.Mvc.ViewPage<IEnumerable<todo_moble_oauth.Models.todo>>を継承したいが、私はこれを使用するとき、私はエラーを取得する: `辞書に渡されたモデルアイテムはこれが私のIndex図であるタイプ

System.Data.Linq.DataQuery`1[todo_moble_oauth.Models.todo]', but this dictionary requires a model item of type 'todo_moble_oauth.Models.LoginModel' 

である

​​

次のように私の部分図_ListTodosは次のとおりです。

<%@ 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) %> 
<% } %> 

LoginModelは、次のあります

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; } 
} 

HomeControllerIndex()方法:

[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(); 
    } 

すべてのヘルプは大歓迎です、ありがとう。

答えて

6

確かにあなたはそれを行うことができます。

<% Html.Partial("_ListTodos", userTodos); %> 

パーシャルヘルパーへのパラメータとしてuserTodosを渡します。

return View(todos);Indexアクションメソッドのインデックスページ/ビューにtodosのリストを戻しているために表示されるエラーです。インデックスページには、IEnumerableのToDoオブジェクトの代わりにLoginModelオブジェクトが必要です。

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<todo_moble_oauth.Models.LoginModel>" %> 

これを解決するために、あなたはあなたががtodosを渡している方法を変更する必要があります。これを行うには、ビューで

[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); 

     LoginModel model = new LoginModel(); 
     model.Todos = todos; 

     return View(model); 
    } 

    return View(); 
} 

[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; } 

public IEnumerable<todo_moble_oauth.Models.todo> Todos { get; set; } 

をしてから、あなたのindexアクションメソッドを変更:あなたのIndexページはLoginModelを受信するので、あなたはこのように、このクラスにTodosプロパティを追加することができます。

<% Html.Partial("_ListTodos", Model.Todos); %> 
+2

大変ありがとうございます。これは素晴らしい解決策です。私は '%Html.Partial(" _ ListTodos "、Model.Todos)を切り替える必要がありました。 %> 'を<%Html.RenderPartial(" _ ListTodos "、Model.Todos); %> 'それを動作させるためには、すべてが金である、ありがとう! – Neil

+0

私は同様の状況がありましたが、モデルの新しいインスタンスを作成するだけで済むので、モデルの構造は少し異なり、変更する必要はありませんでした。私の必要に応じて、このコード行(剃刀構文)を使用しました。 @ Html.Partial( "dialogs/_partial-view"、new MyObjectModel()) – David

関連する問題