【问题标题】:MVC controller doesn't run on view loadMVC 控制器不在视图加载时运行
【发布时间】:2015-12-10 03:38:32
【问题描述】:

我是 ASP.NET MVC 的新手,我真的很困惑。我有一个控制器 ActionResult 方法,它为我的视图模型中的不同项目分配值。我已经做了很多搜索,但我就是想不通。当视图加载时,如何让控制器运行,然后从方法中获取一个值并在视图中使用它?在我看来,我有一个跨度,我希望控制器方法中的 StatusVM.StatusName 的值显示在视图的标签中。

这是我的看法:

@model Models.StatusViewModel

@using (Html.BeginForm())
{    
    <span>@Html.LabelFor(m => m.StatusName)</span>
}

这是我的控制器:

public ActionResult Status()
{
    var Statuses = _Methods.GetStatuses();

    var AccountInfo = _Methods.GetAccount(User.AccountID) ?? new TC.DomainModels.Models.AccountModel();

    var StatusVM = new StatusViewModel();            

    //fill out the VM, you can use Mappers, you can use switch, anything to get the values form the account and tracStatusList into the VM

    var accountStatusInfo = Statuses.Where(s => s.StatusId == (int)AccountInfo.Status).FirstOrDefault();

    StatusVM.StatusName = String.IsNullOrEmpty(accountStatusInfo.StatusMask) ? accountStatusInfo.Status : accountStatusInfo.StatusMask;

    var carrierTerm = _accountService.GetAccountCarrierTerms(User.AccountID);
    if(carrierTerm.IsSMSNE)
    {
        StatusVM.ImagePath = accountStatusInfo.SmsneImage; 
    }                
    else
    {
         StatusVM.ImagePath = accountStatusInfo.StatusImage; 
    }


    switch (AccountInfo.Status)
    {
        case TC.DomainModels.Models.Status.Certified :
            StatusVM.ModalPath = "";
            break;
    }

    return PartialView("Navbar/nav_carrierstatus_new", StatusVM);
}

这是我的视图模型:

public class StatusViewModel
{
    public string StatusName { get; set; }
    public string ImagePath { get; set; }
    public bool UseImage { get { return !String.IsNullOrEmpty(ImagePath); } }
    public string ModalPath { get; set; }

    public StatusViewModel()
    {

    }
}

如果有人能告诉我我做错了什么,那就太好了。提前致谢。

更新错误信息:

{"Execution of the child request failed. Please examine the InnerException for more information."}

{"The controller for path '/' was not found or does not implement IController."}

StackTrace:

   at System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.Wrap[TResult](Func`1 func)
   at System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerAsyncWrapper.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
   at System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride)
   at System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage)
   at System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm)
   at System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm)
   at System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues, TextWriter textWriter)
   at System.Web.Mvc.Html.ChildActionExtensions.Action(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues)
   at System.Web.Mvc.Html.ChildActionExtensions.Action(HtmlHelper htmlHelper, String actionName, String controllerName)
   at ASP._Page_Views_Shared_Navbar__navbar_cshtml.Execute() in c:\source code\TC Web UI Project\Branches\Branch Update TF Status Process\Views\Shared\Navbar\_navbar.cshtml:line 20
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
   at System.Web.Mvc.WebViewPage.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.HtmlHelper.RenderPartialInternal(String partialViewName, ViewDataDictionary viewData, Object model, TextWriter writer, ViewEngineCollection viewEngineCollection)
   at System.Web.Mvc.Html.PartialExtensions.Partial(HtmlHelper htmlHelper, String partialViewName, Object model, ViewDataDictionary viewData)
   at System.Web.Mvc.Html.PartialExtensions.Partial(HtmlHelper htmlHelper, String partialViewName)
   at ASP._Page_Views_Shared_std_siteheader_partialview_cshtml.Execute() in c:\source code\TC Web UI Project\Branches\Branch Update TF Status Process\\Views\Shared\std_siteheader_partialview.cshtml:line 7
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
   at System.Web.Mvc.WebViewPage.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.HtmlHelper.RenderPartialInternal(String partialViewName, ViewDataDictionary viewData, Object model, TextWriter writer, ViewEngineCollection viewEngineCollection)
   at System.Web.Mvc.Html.PartialExtensions.Partial(HtmlHelper htmlHelper, String partialViewName, Object model, ViewDataDictionary viewData)
   at System.Web.Mvc.Html.PartialExtensions.Partial(HtmlHelper htmlHelper, String partialViewName)
   at ASP._Page_Views_Shared__Layout_cshtml.Execute() in c:\source code\TC Web UI Project\Branches\Branch Update TF Status Process\Views\Shared\_Layout.cshtml:line 33
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
   at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
   at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer)
   at System.Web.WebPages.WebPageBase.<>c__DisplayClass3.<RenderPageCore>b__2(TextWriter writer)
   at System.Web.WebPages.HelperResult.WriteTo(TextWriter writer)
   at System.Web.WebPages.WebPageExecutingBase.WriteTo(TextWriter writer, HelperResult content)
   at System.Web.WebPages.WebPageBase.Write(HelperResult result)
   at System.Web.WebPages.WebPageBase.RenderSurrounding(String partialViewName, Action`1 body)
   at System.Web.WebPages.WebPageBase.PopContext()
   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)

调用局部视图的视图:

<nav class="navbar navbar-default">
    <div id="AccountInfoBar" class="container-fluid">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#top-nav">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            @Html.Partial("Navbar/nav_branding_icons")
        </div>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="top-nav">
            <ul class="nav navbar-nav">
                <li id="acctswitch_navsection">@Html.Partial("Navbar/nav_account_switching", new List<Tcetra.Models.AccountSwitchViewModelList>())</li>
                <li id="account_navsection">@Html.Partial("Navbar/nav_account_info")</li>\
                <li id="carriersts_navsection">@Html.Action("Status", "Navbar")</li>
            </ul>

            <ul class="nav navbar-nav navbar-right">
                @Html.Partial("Navbar/nav_recent_transactions")
                @Html.Partial("Navbar/nav_cart")
                <li id="signout"><a href="@Url.Action("Logout", "Login", new { area = "" })" class="HeaderSignOutLink">Sign Out</a></li>
            </ul>
        </div><!-- /.navbar-collapse -->
    </div><!-- /.container-fluid -->
</nav>

【问题讨论】:

  • 你使用什么 URL 来访问这个?
  • 你所描述的没有任何意义。视图不会“加载”,除非控制器操作响应它。在不调用控制器操作的情况下如何查看视图?
  • 我必须回到@Patrick 问你的问题。您试图在浏览器中显示什么 URL?您发布的异常是引用 _layout.cshtml 文件。可以发一下吗?
  • 看看std_siteheader_partialview.cshtml:line 7。这在您的堆栈跟踪中被引用。您确实应该仔细查看异常消息和堆栈跟踪。我认为您当前的错误现在是另外一回事了。
  • Status 操作的控制器名称是什么?它是否存在于 ASP.NET MVC 的“区域”中?现在感觉像是 MVC 中的路由问题。

标签: c# asp.net-mvc


【解决方案1】:

我想我知道你在寻找什么。从 cmets 到这个问题:

帕特里克说:

您使用什么 URL 来访问它?

hollyquinn 回应:

@Patrick 它加载到另一个页面中。我从&lt;li id="carriersts_navsection"&gt;@Html.Partial("Navbar/TStatus")&lt;/li&gt;得到它

@Html.Partial 方法在当前控制器操作执行期间渲染一个部分。它不会调用另一个控制器操作——我认为这就是你断开连接的地方。

相反,您似乎想在呈现当前控制器操作的视图时调用另一个控制器操作:

<li id="carriersts_navsection">@Html.Action("Status", "Navbar")</li>

你想要@Html.Action (ChildActionExtensions.Action)

使用指定的参数和控制器名称调用指定的子操作方法,并将结果作为 HTML 字符串返回。

【讨论】:

  • 嗨,格雷格。我试过你说的,但我收到一条错误消息。 System.Web.dll 中发生了“System.Web.HttpException”类型的异常,但未在用户代码中处理我试图查找它,但我不确定它与我的代码中发生的事情有什么关系。跨度>
  • @hollyquinn:您能否发布完整的错误消息,包括您问题中的堆栈跟踪?还有其他问题。
  • 我添加了它。感谢您的帮助。
  • 您更新的堆栈跟踪显示您的控制器没有实现 IController。你能发布你的控制器的定义吗......该行应该看起来像“public class AccountController : Controller {”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
相关资源
最近更新 更多