Dropdownlist Error System.Nullreferenceexception' in VB

Asked

Viewed 36 times

0

I need to create a function to introduce a new defect, which is associated with one or several processes (for now I haven’t figured out how to select several), but I want the processes to appear in a dropboxlist, I’ve done this in the edit function and it worked, the problem is that in the function create n with you. I will leave the code I created for the function edit and for the function create and the related views, I thank from now on who can help me.

' GET: DEF_DEFECT/Create
    Function Create() As ActionResult
        Return View()
    End Function

    ' POST: DEF_DEFECT/Create
    'To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    'more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    <HttpPost()>
   <ValidateAntiForgeryToken()>
    Function Create(<Bind(Include:="CODE_DEF,DESCRIPTION_DEF")> ByVal dEF_DEFECT As DEF_DEFECT) As ActionResult
        If ModelState.IsValid Then
            Dim processToUpdate = db.DEF_DEFECT _
                           .Include(Function(i) i.PRO_PROCESS) _
                           .Where(Function(i) i.CODE_DEF = dEF_DEFECT.CODE_DEF) _
                           .Single()

            Dim processSelected As String = Request.Form("ProcessesList").ToString()

            UpdateDefectProcess(processToUpdate, processSelected)

            db.Entry(processToUpdate).State = EntityState.Modified

            db.SaveChanges()
            Return RedirectToAction("Index")
        End If
        Return View(dEF_DEFECT)
    End Function'

A view create

            Code
            <div>
                @Html.EditorFor(Function(model) model.CODE_DEF, New With {.htmlAttributes = New With {.class = "form-control"}})
                @Html.ValidationMessageFor(Function(model) model.CODE_DEF, "", New With {.class = "text-danger"})
            </div>
        </div>

        <div class="form-group">

            Description
            <div>
                @Html.EditorFor(Function(model) model.DESCRIPTION_DEF, New With {.htmlAttributes = New With {.class = "form-control"}})
                @Html.ValidationMessageFor(Function(model) model.DESCRIPTION_DEF, "", New With {.class = "text-danger"})
            </div>
        </div>
        <div class="form-group">
            Process
            <div>

'There’s always a mistake here' @Html.Dropdownlist("Processeslist", Ctype(Viewbag.Plist, Ienumerable(Of Selectlistitem)), New Multiselectlist(Model.PRO_PROCESS, Model.selectedProcesses, "CODE_PRO") End Using

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

A view Edit

Code
    <div>
        @Html.EditorFor(Function(model) model.CODE_DEF, New With {.htmlAttributes = New With {.class = "form-control"}})
        @Html.ValidationMessageFor(Function(model) model.CODE_DEF, "", New With {.class = "text-danger"})
    </div>
</div>
<div class="form-group">
    Description
    <div>
        @Html.EditorFor(Function(model) model.DESCRIPTION_DEF, New With {.htmlAttributes = New With {.class = "form-control"}})
        @Html.ValidationMessageFor(Function(model) model.DESCRIPTION_DEF, "", New With {.class = "text-danger"})
    </div>
</div>
<div>
    <div>
        <label for="ProcessCode">Process</label>
        @Html.DropDownList("ProcessesList", CType(ViewBag.PList, IEnumerable(Of SelectListItem)), New MultiSelectList(Model.PRO_PROCESS, Model.selectedProcesses, "CODE_PRO"))
    </div> 
</div>
<div class="form-group">
    <div>
        <input type="submit" value="Save" class="btn btn-default" />

Edit

 ' GET: DEF_DEFECT/Edit/5
    Function Edit(ByVal id As String) As ActionResult
        If IsNothing(id) Then
            Return New HttpStatusCodeResult(HttpStatusCode.BadRequest)
        End If

        Dim dEF_DEFECT As DEF_DEFECT = db.DEF_DEFECT.Find(id)
        If IsNothing(dEF_DEFECT) Then
            Return HttpNotFound()
        End If

        PopulateProcessesDropDownList(dEF_DEFECT.PRO_PROCESS)

        Return View(dEF_DEFECT)
    End Function


    Sub PopulateProcessesDropDownList(selectedprocesses As Object)
        ' Dropdown Lists
        Dim allProcesses = From s In db.PRO_PROCESS
              Order By s.CODE_PRO
              Select s.CODE_PRO, s.DESCRIPTION_PRO Distinct

        ViewBag.PList = New SelectList(allProcesses, "CODE_PRO", "CODE_PRO", selectedValue:=selectedprocesses)
    End Sub

    ' POST: DEF_DEFECT/Edit/5
    'To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    'more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    <HttpPost()>
    <ValidateAntiForgeryToken()>
    Function Edit(<Bind(Include:="CODE_DEF,DESCRIPTION_DEF")> ByVal dEF_DEFECT As DEF_DEFECT) As ActionResult
        If ModelState.IsValid Then
            Dim processToUpdate = db.DEF_DEFECT _
                           .Include(Function(i) i.PRO_PROCESS) _
                           .Where(Function(i) i.CODE_DEF = dEF_DEFECT.CODE_DEF) _
                           .Single()

            Dim processSelected As String = Request.Form("ProcessesList").ToString()

            UpdateDefectProcess(processToUpdate, processSelected)

            db.Entry(processToUpdate).State = EntityState.Modified

            db.SaveChanges()
            Return RedirectToAction("Index")
        End If
        Return View(dEF_DEFECT)
    End Function
    Private Sub UpdateDefectProcess(updateDefect As DEF_DEFECT, processSelected As String)
        'Dim selectedProcessHS = New HashSet(Of String)(processSelected)
        Dim selectedProcessHS = processSelected

        Dim defectProcess As IEnumerable(Of String) = New HashSet(Of String)(updateDefect.PRO_PROCESS.Select(Function(c) c.CODE_PRO))
        For Each c In db.PRO_PROCESS
            If selectedProcessHS.Contains(c.CODE_PRO.ToString()) Then
                updateDefect.PRO_PROCESS.Add(c)
            Else
                If defectProcess.Contains(c.CODE_PRO) Then
                    updateDefect.PRO_PROCESS.Remove(c)
                End If
            End If

        Next

    End Sub
  • Inspect the model being passed to see if it is not null. Check the controller to see if you are passing the model to the view.

  • Marco I’m very new to this and I’ve already caught the application in the middle... It can be more explicit.?

  • see if the controller action is passing something like Return view(model) and if the model is null. work with c#. I don’t know how it would look in Vb

  • I’m really lost... On top I posted the controller...

1 answer

0


I got..

I added in the model Def_defect

 Public Overridable Property selectedProcesses As ICollection(Of PRO_PROCESS) = New HashSet(Of PRO_PROCESS)

and in the def_defect view create replaces the code with:

<div class="form-group">
             Process Code                 
                 @Html.DropDownList("ProcessesList", CType(ViewBag.ProcessCode, IEnumerable(Of SelectListItem)))
                 @Html.ValidationMessageFor(Function(model) model.selectedProcesses, "", New With {.class = "text-danger"})
         </div>

And on the controller it was like this:

 ' GET: DEF_DEFECT/Create
    Function Create() As ActionResult
        PopProcessDropDownList()
        Return View()
    End Function

    ' POST: DEF_DEFECT/Create
    'To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    'more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    <HttpPost()>
    <ValidateAntiForgeryToken()>
    Function Create(<Bind(Include:="CODE_DEF,DESCRIPTION_DEF")> ByVal dEF_DEFECT As DEF_DEFECT) As ActionResult
        If ModelState.IsValid Then
            db.DEF_DEFECT.Add(dEF_DEFECT)

            Dim processSelected As String = Request.Form("ProcessesList").ToString()

            UpdateDefectProcess(dEF_DEFECT, processSelected)

            db.SaveChanges()
            Return RedirectToAction("Index")

        End If
        Return View(dEF_DEFECT)
    End Function

Browser other questions tagged

You are not signed in. Login or sign up in order to post.