我正在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的新手)
答案 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代码,因此当我创建一个新对象时,它没有像我预期的那样填充该集合。
在大坝计算机上大喊一周之后,这一切都归结为用户错误而没有正确设置数据库构建脚本。