Исключение индекса вне границ со списком тегов из базы данных

Кажется, не могу понять, почему в списке тегов есть исключение за пределами при попытке добавить тег к видео в Edit. Я думал, что ilist автоматически создает новую позицию для элемента, когда это необходимо... Теги должны быть связаны с данным видео; поэтому он должен сгенерировать новый тег и быть связан с видео. тем не менее, я немного испортил это, например, используя Session.merge вместо Session.save, и это создает новое видео, а не новый тег... но оставляя теги [i].tagdescription как есть, генерирует исключение outofbounds. Я уверен, что ответ очевиден, но он ускользает от меня.

Изменить вид

@model PatientEducationAdmin.Models.Domain.Video

@{
    ViewBag.Title = "Edit";
}
@*putting black outline on text boxes*@

@*editors location*@
<div id="div8class" style="background-color: beige; width: 936px; border-bottom-left-radius: 15px; border-bottom-right-radius: 15px">
    <h2>Edit</h2>

    @using (Html.BeginForm())
    {
        @Html.ValidationSummary(true)



@*edit for tags*@


        <div class="editor-field">
            <table style="text-align: center; align-content: center; float: none; margin: 10px auto; width: 500px;">
                <tr>

                    <th>@Html.DisplayNameFor(model => model.Tags[0].TagID)</th>
                    <th>@Html.DisplayNameFor(model => model.Tags)</th>

                </tr>



                @{int i = 0;}
                @using PatientEducationAdmin.Models.DAL.Repositories
                @{ TagRepository tagDB = new TagRepository();}
                @foreach (var item in Model.Tags)
                {
                    <tr>

                        <td>
                            @Html.TextBoxFor(modelitem => item.TagID, new { @readonly = "readonly" })


                        </td>
                        <td>
                            @Html.TextBoxFor(modelItem => item.TagDescription, new { @readonly = "readonly" })


                        </td>
                        <td>
                            <button type="button" onclick="delTag()">Delete</button>
                            @*want a button to delete a specific tag or disassociate it from video...*@

                        </td>

                    </tr>
                    <tr>

                        @{i++;}
                    </tr>
                }

            </table>
            <div class="editor-field">

                @Html.EditorFor(model => model.Tags[i], new { id = "tagadd" })
                <button>Add Tag</button>
            </div>
        </div>
        <p>
            <input type="submit" value="Save" />
        </p>

    }

    <div>
        @Html.ActionLink("Back to List", "SearchVideos")
    </div>

    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")
    }
</div>

ВидеоКонтроллер

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PatientEducationAdmin.Models.Domain;
using PatientEducationAdmin.Models;
using PatientEducationAdmin.Models.DAL.Repositories;


namespace PatientEducationAdmin.Controllers
{
    public class VideoController : Controller
    {

        private VideoRepository dbVideo = new VideoRepository();
        private TagRepository dbTag = new TagRepository();


        //
        // GET: /CRUD/Edit/5

        public ActionResult Edit(int id = 0)
        {
            Video video = dbVideo.GetVideo(id);

            if (video == null)
            {
                return HttpNotFound();
            }
            return View(video);
        }

        //
        // POST: /CRUD/Edit/5

        [HttpPost]
        public ActionResult Edit(Video video, Tag[] tags)
        {

            if (ModelState.IsValid)
            {

                foreach (var tag in video.Tags)
                {
                    dbTag.Save(tag);
                    tag.Videos.Add(video);
                }

                dbVideo.Save(video);

                return RedirectToAction("SearchVideos");
            }
            return View(video);
        }

Стек вызовов

mscorlib.dll!System.ThrowHelper.ThrowArgumentOutOfRangeException() + 0x49 bytes 

mscorlib.dll!System.Collections.Generic.List.this[int].get(int index = 1) + 0x23 байта

NHibernate.dll!NHibernate.Collection.Generic.PersistentGenericBag<PatientEducationAdmin.Models.Domain.Tag>.System.Collections.Generic.IList<T>.get_Item(int index = 1) + 0x87 bytes 
[Lightweight Function]  


System.Web.Mvc.dll!System.Web.Mvc.ExpressionUtil.CachedExpressionCompiler.Compiler<PatientEducationAdmin.Models.Domain.Video,PatientEducationAdmin.Models.Domain.Tag>.CompileFromFingerprint.AnonymousMethod__4(PatientEducationAdmin.Models.Domain.Video model = {PatientEducationAdmin.Models.Domain.Video}) + 0x42 bytes 


System.Web.Mvc.dll!System.Web.Mvc.ModelMetadata.FromLambdaExpression<PatientEducationAdmin.Models.Domain.Video,PatientEducationAdmin.Models.Domain.Tag>.AnonymousMethod__2() + 0x88 bytes   


System.Web.Mvc.dll!System.Web.Mvc.ModelMetadata.Model.get() + 0x3c bytes    

System.Web.Mvc.dll!System.Web.Mvc.Html.TemplateHelpers.TemplateHelper(System.Web.Mvc.HtmlHelper html = {System.Web.Mvc.HtmlHelper},

Метаданные System.Web.Mvc.ModelMetadata = {System.Web.Mvc.CachedDataAnnotationsModelMetadata}, string htmlFieldName = "Tags[1]", string templateName = null, System.Web.UI.WebControls.DataBoundControlMode mode = Edit, object AdditionalViewData = {id = "tagadd"},

System.Web.Mvc.Html.TemplateHelpers.ExecuteTemplateDelegate executeTemplate = {Method = {System.Reflection.RuntimeMethodInfo}}) + 0x94 байта
System.Web.Mvc.dll!System.Web.Mvc.Html.TemplateHelpers.TemplateHelper (System.Web.Mvc.HtmlHelper html = {System.Web.Mvc.HtmlHelper}, метаданные System.Web.Mvc.ModelMetadata = {System.Web.Mvc.CachedDataAnnotationsModelMetadata}, строка htmlFieldName = "Tags [1]", строка templateName = null, System.Web.UI.WebControls.DataBoundControlMode, режим = Изменить, объект AdditionalViewData = {id = "tagadd" }) + 0x5f bytes
System.Web.Mvc.dll!System.Web.Mvc.Html. TemplateHelpers.TemplateFor(System.Web.Mvc.HtmlHelper html = {System.Web.Mvc.HtmlHelper},

System.Linq.Expressions.Expression> выражение = {System.Linq.Expressions.Expression>}, строка templateName = null, строка htmlFieldName = null, режим System.Web.UI.WebControls.DataBoundControlMode = Edit, объект AdditionalViewData = { id = "тагадд" },

System.Web.Mvc.Html.TemplateHelpers.TemplateHelperDelegate templateHelper = {Method = {System.Reflection.RuntimeMethodInfo}}) + 0xe4 bytes
System.Web.Mvc.dll!System.Web.Mvc.Html.TemplateHelpers.TemplateFor (System.Web.Mvc.HtmlHelper html = {System.Web.Mvc.HtmlHelper},

System.Linq.Expressions.Expression> выражение = {System.Linq.Expressions.Expression>}, строка templateName = null, строка htmlFieldName = null, режим System.Web.UI.WebControls.DataBoundControlMode = Edit, объект AdditionalViewData = { id = "tagadd" }) + 0x8d байт
System.Web.Mvc.dll!System.Web.Mvc.Html.EditorExtensions.EditorFor(System.Web.Mvc.HtmlHelper html = {System.Web.Mvc.HtmlHelper},

System.Linq.Expressions.Expression> выражение = {System.Linq.Expressions.Expression>}, объект AdditionalViewData = {id = "tagadd"}) + 0x5e байт

Я думаю, что ваша проблема здесь:


person rtbaldwin    schedule 10.07.2013    source источник
comment
Итак, при этом я должен вставить ненулевой тег. Ибо в БД настроено не принимать нулевые теги. Однако при создании фиктивного тега, который можно редактировать, он отправляет обратно. Пакетное обновление вернуло неожиданное количество строк; фактическое количество строк 0 ожидается 1. Что, я думаю, означает, что он хочет сохранить вместо обновления. Что, я думаю, имеет смысл, потому что тег еще не существует... Есть предложения?   -  person Rippo    schedule 10.07.2013


Ответы (1)


Если в списке тегов 1 элемент, то i в этот момент будет 1, что выходит за пределы массива model.Tags.

@Html.EditorFor(model => model.Tags[i], new { id = "tagadd" })

Возможно, вы сможете решить эту проблему, добавив сначала фиктивный элемент:

Этот пост нужно обрезать, его слишком много для прочтения, не могли бы вы сделать его немного проще для нас? Также вы можете опубликовать фактическую ошибку и трассировку стека, хотя и после того, как вы обрезали это...

@Model.Tags.Add(new Tag());
@Html.EditorFor(model => model.Tags[i], new { id = "tagadd" })
person Eric Petroelje    schedule 10.07.2013
comment
@user2565122 user2565122 - Извините, ничем не могу вам помочь. Это больше похоже на проблему, связанную с NHibernate, которая на самом деле не является моей областью знаний. - person rtbaldwin; 11.07.2013
comment
Решено: чтобы решить мою проблему, я взял старое видео и удалил его, а затем поместил отредактированную версию в базу данных. Это оказалось самым эффективным решением. - person Eric Petroelje; 11.07.2013
comment
App_Web_gfall1nh.dll!ASP._Page_Views_Video_Edit_cshtml.Execute() Строка 138 + 0x27b байт C# System.Web.WebPages.dll!System.Web.WebPages.WebPageBase.ExecutePageHierarchy() + 0xc6 байт System.Web.Mvc.dll!System.Web .Mvc.WebViewPage.ExecutePageHierarchy() + 0x78 байт
System.Web.WebPages.dll!System.Web.WebPages.StartPage.RunPage() + 0x12 байт
System.Web.WebPages.dll!System.Web .WebPages.StartPage.ExecutePageHierarchy() + 0x3f bytes
System.Web.WebPages.dll!System.Web.WebPages.WebPageBase.ExecutePageHierarchy(System.Web.WebPages.WebPageContext pageContext, System.IO.TextWriter Writer, System. Web.WebPages.WebPageRenderingBase startPage) + 0x4d байт
System.Web.Mvc.dll!System.Web.Mvc.RazorView.RenderView(System.Web.Mvc.ViewContext viewContext = {System.Web.Mvc.ViewContext}, Модуль записи System.IO.TextWriter = {System.Web.HttpWriter}, экземпляр объекта = {ASP._Page_Views_Video_Edit_cshtml}) + 0x2e8 байт
System.Web.Mvc.dll!System.Web.Mvc.Bu ildManagerCompiledView.Render(System.Web.Mvc.ViewContext viewContext = {System.Web.Mvc.ViewContext}, System.IO.TextWriter Writer = {System.Web.HttpWriter}) + 0x17f байт
System.Web.Mvc. dll!System.Web.Mvc.ViewResultBase.ExecuteResult(System.Web.Mvc.ControllerContext context = {System.Web.Mvc.ControllerContext}) + 0x1b0 байт System.Web.Mvc.dll!System.Web.Mvc.ControllerActionInvoker. InvokeActionResult(System.Web.Mvc.ControllerContext controllerContext = {System.Web.Mvc.ControllerContext}, System.Web.Mvc.ActionResult actionResult = {System.Web.Mvc.ViewResult}) + 0x28 байт
System.Web. Mvc.dll!System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters.AnonymousMethod_17() + 0x4b байт
System.Web.Mvc.dll!System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(System.Web.Mvc Фильтр .IResultFilter = {PatientEducationAdmin.Controllers.VideoController}, System.Web.Mvc.ResultExecutingContext preContext = {System.Web.Mvc.ResultExecutingCont ext}, продолжение System.Func = {Method = {System.Reflection.RuntimeMethodInfo}}) + 0xb2 байта
System.Web.Mvc.dll!System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters.AnonymousMethod
_19 () + 0x49 байт
System.Web.Mvc.dll!System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(System.Web.Mvc.ControllerContext controllerContext = {System.Web.Mvc.ControllerContext}, System.Collections.Generic Фильтры .IList = Количество = 1, Система. Web.Mvc.ActionResult actionResult = {System.Web.Mvc.ViewResult}) + 0x130 байт
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction.AnonymousMethod_20() + 0x9c байт
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction.AnonymousMethod
_22(System.IAsyncResult asyncResult = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult }) + 0x44 байта
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult.End() + 0x89 байт
System.Web.Mvc.dll!System.Web.Mvc .Async.AsyncResultWrapper.End(System.IAsyncResult asyncResult = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}, тег объекта = {object}) + 0x39 байт
System.Web.Mvc.dll!System.Web .Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(System.IAsyncResult asyncResult = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}) + 0x29 байт System.Web.Mvc.dll!System.Web.Mvc .Controller.BeginExecuteCore.AnonymousMethod_18(System.IAsyncResult asyncResult = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}) + 0x29 байт
System.Web.Mvc.dll!System.Web.Mvc. Async.AsyncResultWrapper.MakeVoidDelegate.AnonymousMethod
_3(System.IAsyncResult ar = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}) + 0x30 байт
System.Web.Mvc.dll!System.Web. Mvc.Async.AsyncResultWrapper.WrappedAsyncResult.End() + 0x98 байт
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.End(System.IAsyncResult asyncResult = {System.Web.Mvc.Async .AsyncResultWrapper.WrappedAsyncResult}, тег объекта = {object}) + 0x3c байт
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.End(System.IAsyncResult asyncResult = {System.Web.Mvc .Async.AsyncResultWrapper.WrappedAsyncResult}, тег объекта = {object}) + 0x29 байт
System.Web.Mvc.dll!System.Web.Mvc.Controller.EndExecuteCore(System.IAsyncResult asyncResult = {System.W eb.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}) + 0x2d байт
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.MakeVoidDelegate.AnonymousMethod_3(System.IAsyncResult ar = {System. .Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}) + 0x30 байт
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult.End() + 0x98 байт
System.Web .Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.End(System.IAsyncResult asyncResult = {System. Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}, тег объекта = {object}) + 0x3c байт
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.End(System.IAsyncResult asyncResult = { System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}, тег объекта = {object}) + 0x29 байт
System.Web.Mvc.dll!System.Web.Mvc.Controller.EndExecute(System.IAsyncResult asyncResult = { System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}) + 0x28 байт
System.Web.Mvc.dll!System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(System.IAsyncResult asyncResult = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}) + 0x28 байт
System.Web.Mvc.dll!System.Web.Mvc.MvcHandler.BeginProcessRequest.AnonymousMethod
_3(System.IAsyncResult asyncResult = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}) + 0x2e байт
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.MakeVoidDelegate.AnonymousMethod__3(Syste m.IAsyncResult ar = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}) + 0x30 байт
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult.End() + 0x98 bytes
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.End(System.IAsyncResult asyncResult = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}, тег объекта = {object}) + 0x3c bytes
System.Web.Mvc.dll!System.Web.Mvc.Async.AsyncResultWrapper.End(System.IAsyncResult asyncResult = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}, тег объекта = {object }) + 0x29 байт
System.Web.Mvc.dll!System.Web.Mvc.MvcHandler.EndProcessRequest(System.IAsyncResult asyncResult = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}) + 0x29 байт System. Web.Mvc.dll!System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(System.IAsyncResult result = {System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult}) + 0x27 байт System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0x242 байта
System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication .IExecutionStep step = {System.Web.HttpApplication.CallHandlerExecutionStep}, ref bool CompletedSynchronously = false) + 0x9c байт System.Web.dll!System.Web.HttpApplication.PipelineStepManager.ResumeSteps(System.Exception error) + 0x474 байт System. Web.dll!System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext контекст, System.AsyncCallback cb) + 0x60 байт System.Web.dll!System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest wr = {System.Web.Hosting.IIS7WorkerRequest}, System.Web.HttpContext context = {System.Web.HttpContext}) + 0xbb bytes
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(System.IntPtr rootedObjectsPointer, System.IntPtr nativeRequestContext = 494414820, System.IntPtr moduleData, int flags) + 0x245 байт
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(System.IntPtr rootedObjectsPointer, System.IntPtr nativeRequestContext, System .IntPtr moduleData, int flags) + 0x1f bytes
[Переход от собственного к управляемому]
[Переход от управляемого к собственному]
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(System.IntPtr корень edObjectsPointer, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) + 0x372 байта
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(System.IntPtr rootedObjectsPointer, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) + 0x1f bytes
[Переход домена приложения] - person rtbaldwin; 18.07.2013