首页 文章

在视图中使用2个模块:System.Web.Mvc.dll中出现类型'System.InvalidOperationException'的异常,但未在用户代码中处理

提问于
浏览
2

我是asp.net的新手 . 通过尝试解决问题我得到了这个错误:

System.InvalidOperationException未由用户代码处理HResult = -2146233079 Message = Templates只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式 . Source = System.Web.Mvc StackTrace:位于System.Web.Mvc.Hv.DisplayNameExtensions.DisplayNameForInternal的System.Web.Mvc.ModelMetadata.FromLambdaExpression [TParameter,TValue](Expression1表达式,ViewDataDictionary1 viewData,ModelMetadataProvider metadataProvider) ASP中的System.Web.Mvc.Html.DisplayNameExtensions.DisplayNameFor [TModel,TValue](HtmlHelper1 html,Expression1表达式)中的[TModel,TValue](HtmlHelper1 html,Expression1表达式,ModelMetadataProvider metadataProvider) . _Page_Views_Users_Index_cshtml.Execute()位于c:\ Index.cshtml:第28行,位于System.Web.WebPages.Web上的System.Web.Mvc.WebViewPage.ExecutePageHierarchy()中的System.Web.WebPages.WebPageBase.ExecutePageHierarchy(),位于System.Web.WebPages.StartPage.RunPage( )System.Web.Mvc.RazorView.RenderView(ViewContext viewContext,TextWriter writer,System.Web.WebPages.WebartBase.ExecutePageHierarchy(WebPageContext pageContext,TextWriter writer,WebPageRenderingBase startPage)中的System.Web.WebPages.StartPage.ExecutePageHierarchy()对象在System.Web.Mvc.View.Mvc.Buvid.Rerult上的System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext,TextWriter writer)处于System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext,ActionResult actionResult)的System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext,TextWriter writer)在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList1过滤器,Int32 filterIndex,ResultExecutingContext preContext,ControllerContext controllerContext,ActionResult actionResult)在System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList1过滤器,Int32 filterIndex,ResultExecutingContext preContext, ControllerContext controllerContext,ActionResult actionResult)InnerException:

主要想法,我想在我看来代表2个模块 . 所以我为这两个模块创建了单独的类

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

这是我的控制器,我回到我的视图:

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

这里是我的视图,我想获取我的用户登录名的数据,但我有异常:(

@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

如何使用lambda表达式访问我的数据?如何通过使用具有两个模块的类来正确地访问这些数据?

1 回答

  • 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个模块 .

相关问题