我目前正在完成VS2012中的第一个ASP.MVC4项目,我想知道如何处理数据到文本框和组合框(选择块)的绑定,然后如何将结果返回给控制器?
模型
Public Class OpenBuildFaultsViewModel
Public Property FailureID As Int64
Public Property ModelName As String
Public Property ZoneName As String
Public Property Fault As String
Public Property FaultCode As String
Public Property FaultCodeDetail As String
Public Property FaultArea As String
Public Property MajorAssembly As String
Public Property SubAssembly As String
Public Property ComponentAssembly As String
Public Property BusinessTest As String
Public Property AuditScore As String
Public Property Comment As String
Public Property ShortagePart As String
Public Property CreatedBy As String
Public Property FixedByID As Int32
Public Property FixedByComment As String
Public Property FixedByFaultRectificationID As Int32
End Class
Public Class RectificationCodesViewModel
Friend Property ID As Long
Friend Property Description As String
End Class
控制器(失败SignOff方法)
Namespace QSmartRectification
Public Class FailuresController
Inherits System.Web.Mvc.Controller
Function FailureSignOff() As ActionResult
Dim failureID As Int64 = Convert.ToInt64(TempData("FailureID"))
Dim data As IEnumerable(Of OpenBuildFaultsViewModel) = Session("Failures")
Dim model = data.Where(Function(w) w.FailureID.Equals(failureID))
Dim codes As IEnumerable(Of RectificationCodesViewModel) = TryCast(Session("RectificationCodes"), IEnumerable(Of RectificationCodesViewModel))
If codes IsNot Nothing Then
Dim recCodes = From c In codes
Select New SelectListItem With {.Value = c.ID, .Text = c.Description}
ViewBag.RectificationCodes = recCodes
End If
Return View(model.FirstOrDefault)
End Function
' POST: /Failures/FailureSignOff
<HttpPost> _
Function FailureSignOff(model As OpenBuildFaultsViewModel) As ActionResult
Stop
End Function
End Class
End Namespace
查看
@ModelType QSmartRectification.OpenBuildFaultsViewModel
@Code
ViewData("Title") = "Failure Sign Off"
End Code
@section featured
<section class="featured">
<div class="content-wrapper" >
<p class="site-title float-left">QSmart Rectification Sign Off</p>
<input type="image" src="../../Images/Product.png" />
</div>
</section>
End Section
<br />
@Using Html.BeginForm()
@Html.ValidationSummary()
@<fieldset class="fieldset">
<legend>Fault Sign Off</legend>
<section class="contentdetail">
<section class="block">
<div class="divHeader">
<div class="float-left" >
<img alt="Missing Image" src="@String.Format("../../Images/{0}.png", Model.MajorAssembly)"/>
</div>
<div class="divHeaderOffset">
<div class="float-left divHalfSpace">
<label class="header">Major Assembly</label>
<label>@Model.MajorAssembly</label>
<label class="header">Sub Assembly</label>
<label>@Model.SubAssembly</label>
</div>
<div class="float-left divHalfSpace">
<label class="header">Component Assembly</label>
<label>@Model.ComponentAssembly</label>
<label class="header">Business Test</label>
<label>@Model.BusinessTest</label>
</div>
</div>
</div>
<br />
<fieldset class="fieldset">
<legend>Fix Details</legend>
<div class="divDetailMargin">
<div class="float-left divHalfSpace">
<label class="header">Rectification Code</label>
@Html.DropDownListFor(Function(x) x.FixedByFaultRectificationID, ViewBag.RectificationCodes))
</div>
<div class="float-left divHalfSpace">
<label class="header">Rectification Comment</label>
@Html.TextAreaFor(Function(x) x.FixedByComment, 4)
</div>
</div>
</fieldset>
<div class="divButtonHeader">
<div class="divThreeColumns">
</div>
<div class="divThreeColumns">
<input id="FixFault" type="submit" value=""/>
<input id="Back" type="button" value="" onclick="location.href='@Url.Action("Index", "Failures")'" />
</div>
<div class="divThreeColumns">
</div>
</div>
</section>
</section>
</fieldset>
End Using
控制器中的POST当前返回一个空模型,例外是FixedByFaultRectificationID和FixedByComment,它们从视图中选定的Combo项和TextAreaFor中正确填充。
' POST: /Failures/FailureSignOff
<HttpPost> _
Function FailureSignOff(model As OpenBuildFaultsViewModel) As ActionResult
Stop
End Function
结果
答案 0 :(得分:0)
尝试从ReadOnly
媒体资源中删除Failure
关键字。
Public ReadOnly Property Failure As OpenBuildFaultsViewModel
我认为模型绑定器将无法设置属性,因为readonly属性只能在类的声明或构造函数中设置。
答案 1 :(得分:0)
行, 在对MVC和模型绑定进行进一步调查之后,我已经解决了这个问题。在重构代码以使用ViewBag将一些数据传递到视图并通过ViewBag绑定视图数据之后,我可以将更简单的模型传递给View。
在HTTPPost操作中未返回模型的原因是,并非this帖子中讨论的模型中的所有项目都已绑定在视图中。
工作视图
@ModelType QSmartRectification.OpenBuildFaultsViewModel
@Code
ViewData("Title") = "Failure Sign Off"
End Code
@section featured
<section class="featured">
<div class="content-wrapper" >
<p class="site-title float-left">QSmart Rectification Sign Off</p>
<input type="image" src="../../Images/Product.png" />
</div>
</section>
End Section
<br />
@Using Html.BeginForm()
@Html.ValidationSummary()
@<fieldset class="fieldset">
<legend>Fault Sign Off</legend>
<section class="contentdetail">
<section class="block">
<div class="divHeader">
<div class="float-left" >
<img alt="Missing Image" src="@String.Format("../../Images/{0}.png", Model.MajorAssembly)"/>
</div>
@Html.Hidden("FailureID", Model.FailureID)
@Html.Hidden("ModelName", Model.ModelName)
@Html.Hidden("ZoneName", Model.ZoneName)
@Html.Hidden("Fault", Model.Fault)
@Html.Hidden("FaultCode", Model.FaultCode)
@Html.Hidden("FaultCodeDetail", Model.FaultCodeDetail)
@Html.Hidden("FaultArea", Model.FaultArea)
@Html.Hidden("AuditScore", Model.AuditScore)
@Html.Hidden("Comment", Model.Comment)
@Html.Hidden("ShortagePart", Model.ShortagePart)
@Html.Hidden("CreatedBy", Model.CreatedBy)
@Html.Hidden("FixedByID",model.FixedByID)
<div class="divHeaderOffset">
<div class="float-left divHalfSpace">
<label class="header">Major Assembly</label>
@Html.TextBoxFor(Function(x) x.MajorAssembly, New With {.ReadOnly = True})
<label class="header">Sub Assembly</label>
@Html.TextBoxFor(Function(x) x.SubAssembly, New With {.ReadOnly = True})
</div>
<div class="float-left divHalfSpace">
<label class="header">Component Assembly</label>
@Html.TextBoxFor(Function(x) x.ComponentAssembly, New With {.ReadOnly = True})
<label class="header">Business Test</label>
@Html.TextBoxFor(Function(x) x.BusinessTest, New With {.ReadOnly = True})
</div>
</div>
</div>
<br />
<fieldset class="fieldset">
<legend>Fix Details</legend>
<div class="divDetailMargin">
<div class="float-left divHalfSpace">
<label class="header">Rectification Code</label>
@Html.DropDownListFor(Function(x) x.FixedByFaultRectificationID, ViewBag.RectificationCodes)
</div>
<div class="float-left divHalfSpace">
<label class="header">Rectification Comment</label>
@Html.TextAreaFor(Function(x) x.FixedByComment, 4)
</div>
</div>
</fieldset>
<div class="divButtonHeader">
<div class="divThreeColumns">
</div>
<div class="divThreeColumns">
<input id="FixFault" type="submit" value=""/>
<input id="Back" type="button" value="" onclick="location.href='@Url.Action("Index", "Failures")'" />
</div>
<div class="divThreeColumns">
</div>
</div>
</section>
</section>
</fieldset>
End Using
工作控制器
Namespace QSmartRectification
Public Class FailuresController
Inherits System.Web.Mvc.Controller
Function FailureSignOff() As ActionResult
Dim failureID As Int64 = Convert.ToInt64(TempData("FailureID"))
Dim data As IEnumerable(Of OpenBuildFaultsViewModel) = Session("Failures")
Dim model = data.Where(Function(w) w.FailureID.Equals(failureID))
Dim codes As IEnumerable(Of RectificationCodesViewModel) = TryCast(Session("RectificationCodes"), IEnumerable(Of RectificationCodesViewModel))
If codes IsNot Nothing Then
Dim recCodes = From c In codes
Select New SelectListItem With {.Value = c.ID, .Text = c.Description}
ViewBag.RectificationCodes = recCodes
End If
Return View(DirectCast(model.FirstOrDefault, OpenBuildFaultsViewModel))
End Function
' POST: /Failures/FailureSignOff
<HttpPost> _
Function FailureSignOff(model As OpenBuildFaultsViewModel) As ActionResult
Stop
End Function
End Class
End Namespace
使这些更改视图正确填充回HTTPPost上的控制器。