2
@foreach (var item in Model)
{
    <li>
        <div class="lnewsblock">
            <p class="newsthumb">
                <img src="@Html.Raw(item.ShortImage)" width="90" height="71" alt="" /></p>
            <p class="datetxt">@Html.Raw(item.Date.Value.ToString("ddd MM.dd.yyyy"))</p>
            <h2> <a href="/resources/newsdetail?id=@Html.Raw(item.ID.ToString())">@Html.Raw(item.Title)</a></h2>
            <p class="greytxt">@Html.Raw(item.Description.Left(125))<a href="/resources/newsdetail?id=@Html.Raw(item.ID.ToString())"> more</a></p>
        </div>
    </li>
}

上面的代码导致了几个问题。您会注意到它正在拉短图像,这很好。但是,如果没有要 pull 的图像,则会产生错误。我将如何修复代码来解决这个问题?

其次,当它拉取项目描述时,它会尝试拉取第一个125字符。所以如果描述太短,也会产生错误。 我将如何构建代码来解决这个问题?

Server Error in '/' Application.
Index was outside the bounds of the array.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IndexOutOfRangeException: Index was outside the bounds of the array.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:


[IndexOutOfRangeException: Index was outside the bounds of the array.]
   SitefinityWebApp.Mvc.Models.NewsModel.RetrieveCollectionOfNews(NewsType ShowType) in D:\SVN\LbyEgglw\LbyEgglw.WebApp\Mvc\Models\NewsModel.cs:53
   SitefinityWebApp.Mvc.Controllers.NewsController.Index() in D:\SVN\LbyEgglw\LbyEgglw.WebApp\Mvc\Controllers\NewsController.cs:29
   lambda_method(Closure , ControllerBase , Object[] ) +43
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +248
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39
   System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +125
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +640
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +312
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +691
   Telerik.Sitefinity.Mvc.ControllerWrapper.Execute() +133
   Telerik.Sitefinity.Mvc.Proxy.MvcControllerProxy.ExecuteController() +2620
   System.Web.UI.Control.PreRenderRecursiveInternal() +113
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Control.PreRenderRecursiveInternal() +222
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4201


Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.272 
4

2 回答 2

4

这是一个真正的 hack,因为你不应该把这样的逻辑放在你的视图中,但你可以这样做;

@foreach (var item in Model)
{
    <li>
        <div class="lnewsblock">

            <p class="newsthumb">
            @if(item.ShortImage != null)
            {
                <img src="@Html.Raw(item.ShortImage)" width="90" height="71" alt="" /></p>
            }
            </p>

            <p class="datetxt">
                @Html.Raw(item.Date.Value.ToString("ddd MM.dd.yyyy"))
            </p>

            <h2><a href="/resources/newsdetail?id=@Html.Raw(item.ID.ToString())">@Html.Raw(item.Title)</a></h2>

            <p class="greytxt">
            @if(item.Description.Length >= 125)
            {
                @Html.Raw(item.Description.Left(125))<a href="/resources/newsdetail?id=@Html.Raw(item.ID.ToString())"> more</a>
            }
            else
            {
                @Html.Raw(item.Description)<a href="/resources/newsdetail?id=@Html.Raw(item.ID.ToString())"> more</a>
            }
            </p>
        </div>
    </li>
}

真正应该做的是,其中的“模型”部分不应允许您接收视图无法接受的数据。

于 2013-04-02T18:46:25.873 回答
2

不幸的是,您的堆栈跟踪没有多大帮助(至少,不是我)。开发的系统在程序的这个特定部分发生了很多事情,如果没有看到它的代码,我无法为这个问题给出具体的答案或建议。话虽如此,我想与您分享解决您的问题的另一种方法。

不久前,我需要找到一种有效的方法来渲染带有锚标签的图像,以用作图像链接或按钮。虽然在硬编码的 HTML 中执行此操作是可行的……但图像通常是动态的,因此我通过使用一小段代码扩展 MVC 框架找到了一种更加程序化的方法。这里是:

public static MvcHtmlString ActionImage(this HtmlHelper html, string action, object routeValues, string imagePath, string alt)
    {
        var url = new UrlHelper(html.ViewContext.RequestContext);

        // build the <img> tag
        var imgBuilder = new TagBuilder("img");
        imgBuilder.MergeAttribute("src", url.Content(imagePath));
        imgBuilder.MergeAttribute("alt", alt);
        string imgHtml = imgBuilder.ToString(TagRenderMode.SelfClosing);

        // build the <a> tag
        var anchorBuilder = new TagBuilder("a");
        anchorBuilder.MergeAttribute("href", url.Action(action, routeValues));
        anchorBuilder.InnerHtml = imgHtml; // include the <img> tag inside
        string anchorHtml = anchorBuilder.ToString(TagRenderMode.Normal);

        return MvcHtmlString.Create(anchorHtml);
    }

它不是最强大的扩展,但它符合我的目的,它也可以为您服务。将变量写入 HTML 属性(例如:图像的 src)是危险的,因为任何具有基本 HTML 知识的人都可能通过稍作调整就可以侵入您的后端。这是我对jadarnel27解决方案的主要担忧,因为它将您的变量保存在我不喜欢它们的地方。

这个简单的扩展允许使用简单的单行在您的视图中动态、安全地创建链接图像:

<p class="site-title">@Html.ActionImage("Index", null, "~/Images/logo_sm.jpg", "Index")</p>

如果您要根据您的程序需求调整此扩展,您可以在后端进行所有错误处理,这与jadarnel27的解决方案非常相似。这既可以解决您的原始问题,又可以使应用程序更加安全。

不幸的是,您提到这不是您的专业领域,从外观上看,如果应用程序的代码都像您上面发布的代码片段一样,您需要对应用程序进行一些相当大规模和彻底的更改。无论如何,我希望这至少可以帮助您和您的公司在前进的道路上做出明智的决定。

于 2013-04-02T20:19:52.247 回答