asp.net MVC页面在Web服务器上失败但在本地计算机上运行良好

时间:2016-06-26 10:44:41

标签: asp.net-mvc

我正在MVC中创建一个Web应用程序,当它在本地运行时就可以了。我最近将它部署到Azure,我遇到了一些问题。我创建了一个区域,忘了添加web.config文件和_viewStart.cshtml。

添加这些文件后,除了页面外,应用程序的工作正常。当我导航到编辑页面时,页面显示“处理请求时出错”,其中renderbody()部分将会出现。

控制器:

    public ActionResult EditTest(int? id)
    {
    if (id == null)
    {
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    } 

    ROUND_DETAILS rOUND_DETAILS = db.ROUND_DETAILS.Find(id);
    if (rOUND_DETAILS == null)
    {
       return HttpNotFound();
    }
    return View(rOUND_DETAILS);
   }

查看(较小版本)

@model TM470FinalProject.Areas.GolfApp.Models.ROUND_DETAILS

@{
  ViewBag.Title = "Edit";
 }

<h2>Edit</h2>

<div>
 @Html.ActionLink("Back to List", "Index")
 @Model.TEE.GOLF_COURSE.COURSE_NAME
</div>

<table class="table form-group">
<tr>
    <th>Hole Number </th>

    @for (var i = 0; i < 9; i++)
    {

    <th>@Model.HOLE_SCORE.ElementAt(i).HOLE_NUMBER</th>
    }

</tr>
</table>
@section Scripts {
  @Scripts.Render("~/bundles/jqueryval")

}

我看到的消息似乎没有意义,因为我的应用程序中的其他页面都有效:

The type or namespace TM470FinalProject could not be found (are you missing a using directive or reference assembly).

并且

 The name 'model' does not exist in the current context.

对于上面的示例:如果我从视图中删除了表,则上面的消息仍然存在,但@Model.TEE.GOLF_COURSE.COURSE_NAME会显示我期望的课程名称。

我认为问题是ElementAt(i)代码:

@Model.HOLE_SCORE.ElementAt(i).HOLE_NUMBER

这是我不明白为什么它失败的地方,因为我有另一个使用类似代码并且工作正常的视图(但在Web服务器上仍标记上面的2条消息)。

当我在本地机器上编写Razor视图时,intellisense给了我ElementAt选项。

查看:

@model TM470FinalProject.Areas.GolfApp.Models.TEE

@{
   String s = ViewBag.golfcourse.COURSE_NAME;
   int ttlPar;
   int ttlYards;
 }
@{
   ViewBag.Title = "Edit Tee: " + s ;
}

<h2>@s</h2>

<h3>Edit Tee: @Model.TEE_NAME </h3>

<table class="table">
<tr>
   <th>Hole Number </th>
      @for (var i = 0; i < 9; i++)
     {
     <th>  @Model.HOLE_DETAILS.ElementAt(i).HOLE_NUMBER</th>
     }
</tr>
</table>

在我的模型中,他们有相似的定义:

public virtual ICollection<HOLE_SCORE> HOLE_SCORE { get; set; }

public virtual ICollection<HOLE_DETAILS> HOLE_DETAILS { get; set; }

当我附加调试器时,导航到第一个视图时会得到以下输出:

Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in Microsoft.CSharp.dll
Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in System.Core.dll
Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in System.Web.Mvc.dll

我的观点webconfig显示:

<?xml version="1.0"?>

<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
</configSections>

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization"/>
<add namespace="System.Web.Routing" />
<add namespace="TM470FinalProject" />
</namespaces>
</pages>
</system.web.webPages.razor>

<appSettings>
<add key="webpages:Enabled" value="false" />
</appSettings>

<system.webServer>
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
</system.webServer>

<system.web>
<compilation>
<assemblies>
<add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>
</system.web>

它在本地工作,在网络服务器上,一个页面可以正常使用类似的代码,所以我无法解释为什么会这样。

对于解决这个问题的任何帮助/指示,我将不胜感激。另外,您知道如何检索调试器生成的异常的堆栈跟踪吗? (我是asp.net的新手)

1 个答案:

答案 0 :(得分:0)

它使我感到困惑,因为我无法理解为什么它在本地而不是在网络服务器上工作..所以我将以下行添加到共享错误(Views \ Shared \ Error.cshtml)页面:     <p>@Model.Exception.Message</p>

然后,网页会在错误页面上显示其他信息:

Specified argument was out of the range of valid values. Parameter name: index

同样,这不应该发生,因为填充集合的数据是通过我的数据库上的触发器创建的。我开始考虑通过Viewbag发送数据,并添加页面呈现时的分数计数:

@ViewBag.hole_scores.Count

在本地,这按预期返回了18,但在网络服务器上它返回0。

我记得当我第一次将应用程序发布到Azure时,我必须在门户中设置数据库,因为我无法导出/复制本地数据库。不幸的是,我的数据库构建脚本似乎丢失了Trigger代码,因此当我创建一个新对象时,它没有像我预期的那样填充该集合。

在大坝计算机上大喊一周之后,这一切都归结为用户错误而没有正确设置数据库构建脚本。