2016-04-07 14 views
2

私はasp.netでかなり新しいです。問題を解決しようとすると、私はこのエラーを受け取りました:Viewで2つのモジュールを使用:System.Web.Mvc.dllで 'System.InvalidOperationException'タイプの例外が発生しましたが、ユーザーコードで処理されませんでした

System.InvalidOperationException was unhandled by user code
HResult=-2146233079 Message=Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions. Source=System.Web.Mvc
StackTrace: at System.Web.Mvc.ModelMetadata.FromLambdaExpression[TParameter,TValue](Expression`1 expression, ViewDataDictionary`1 viewData, ModelMetadataProvider metadataProvider) at System.Web.Mvc.Html.DisplayNameExtensions.DisplayNameForInternal[TModel,TValue](HtmlHelper`1 html, Expression`1 expression, ModelMetadataProvider metadataProvider) at System.Web.Mvc.Html.DisplayNameExtensions.DisplayNameFor[TModel,TValue](HtmlHelper`1 html, Expression`1 expression) at ASP._Page_Views_Users_Index_cshtml.Execute() in c:\Index.cshtml:line 28 at System.Web.WebPages.WebPageBase.ExecutePageHierarchy() at System.Web.Mvc.WebViewPage.ExecutePageHierarchy() at System.Web.WebPages.StartPage.RunPage() at System.Web.WebPages.StartPage.ExecutePageHierarchy() at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult)
InnerException:

主なアイデア、私は私の見解で2つのモジュールを表現したいと思います。

public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page) 
{ 
    ViewBag.CurrentSort = sortOrder; 
    ViewBag.NameSortParm = String.IsNullOrWhiteSpace(sortOrder) ? "login_desc" : ""; 

    var users = from s in db.Users.Include(u => u.CustomerProject).Include(u => u.Service).Include(u => u.Customer) select s; 
    //var sortUsers = from s in db.Users select s; 

    if(searchString != null) 
    { 
     page = 1; 
    } 
    else 
    { 
     searchString = currentFilter; 
    } 
    ViewBag.CurrentFilter = searchString; 
    if (!String.IsNullOrEmpty(searchString)) 
    { 
     users = users.Where(s => s.Login.Contains(searchString) || s.UserName.Contains(searchString)); 
    } 
    switch (sortOrder) 
    { 
     case "login_desc": 
      users = users.OrderByDescending(s => s.Login); 
      break; 
     default: 
      users = users.OrderBy(s => s.Login); 
      break; 
    } 
    int pageSize = 3; 
    int pageNumber = (page ?? 1); 
    return View("Index",new TimeReportViewMod()); 
} 

そして、ここでは、私は私のユーザーのログイン名のデータを取得したい私のビューです。だから私は、これは私が私のビューに戻る私のコントローラであり、これら2 modulesL

public class TimeReportViewMod 
{ 
    public IEnumerable<TimeReportingLib.User> Model1 { get; set; } 
    public IPagedList<TimeReportingLib.User> Model2 { get; set; } 
} 

のための別のクラスを作成しましたが、私はどのように私はラムダ式で自分のデータにアクセスすることができるか、そしてどのように二つのモジュールとクラスを使用して、これらのデータに適切にeccessし、その例外:(

@model TimeReportingWebApp.TimeReportViewMod 
    @using PagedList.Mvc; 
    <link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" /> 
    @{ 
     ViewBag.Title = "Users"; 
    } 
    <h2>Users</h2> 
    <p> 
     @Html.ActionLink("Create New", "Create") 
    </p> 
    @using (Html.BeginForm("Index", "Users", FormMethod.Get)) 
    { 
     <p> 
      Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string) 
      <input type="submit" class="btn btn-primary" value="Search" /> 
     </p> 
    } 
    <table class="table"> 
     <tr> 
      <th> 
       @Html.ActionLink(Html.DisplayNameFor(m => m.Model1.Select(x => x.Login)).ToHtmlString(), "Index") 
      </th> 
     </tr> 
@foreach (var item in Model.Model1) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Login) 
     </td> 
</tr> 
    </table> 
    Page @(Model.Model2.PageCount < Model.Model2.PageNumber ? 0 : Model.Model2.PageNumber) of @Model.Model2.PageCount 

を得たか

+0

IEnumerable Model1をIListに変更<...> Model1 –

答えて

0

申し訳ありませんが、私は主な問題は何かを考え出しました。 まず、ActionLinkにオブジェクト名を指定する必要はありません。なぜなら、どこにも使用しないからです。だから、それはちょうどそれに単純な文字列を与えるのに十分である。その後

@Html.ActionLink("Login","Index", new { sortOrder = ViewBag.NameSortParm, currentFilter = ViewBag.CurrentFilter }) 

私は私が私のコントローラで私のクラスのインスタンスを作っていないことを考え出し:UsersController.cs。だから、私はそれを宣言した:

var inst = new TimeReportViewMod(); 
inst.Model1 = users.ToList(); 
inst.Model2 = users.ToPagedList(pageNumber, pageSize);  
return View("Index", inst); 

これで、私は完全に2つのモジュールにアクセスできます。

関連する問題