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 Antonio Quintal
Marco I’m very new to this and I’ve already caught the application in the middle... It can be more explicit.?
– Somebody
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
– Marco Antonio Quintal
I’m really lost... On top I posted the controller...
– Somebody