C# 具有ASP.NET MVC的MVVM,部分类作为ViewModel未按预期执行
我使用的是实体框架,因此我不想在EF模型中使用Razor验证语法。出于这个原因,我创建了一个viewmodel来为我进行验证,但很明显,我需要一个在不同状态下支持对象的视图模型。在工作正常的地方,它现在只验证部分字段 两个部分类如下所示C# 具有ASP.NET MVC的MVVM,部分类作为ViewModel未按预期执行,c#,asp.net-mvc,asp.net-mvc-4,mvvm,C#,Asp.net Mvc,Asp.net Mvc 4,Mvvm,我使用的是实体框架,因此我不想在EF模型中使用Razor验证语法。出于这个原因,我创建了一个viewmodel来为我进行验证,但很明显,我需要一个在不同状态下支持对象的视图模型。在工作正常的地方,它现在只验证部分字段 两个部分类如下所示 @model EH.BCRT.AdvisoryRequests.Model.BCRTAdvisoryRequest <link href="@Url.Content("/Content/Site.css")" rel="stylesheet" />
@model EH.BCRT.AdvisoryRequests.Model.BCRTAdvisoryRequest
<link href="@Url.Content("/Content/Site.css")" rel="stylesheet" />
<link href="@Url.Content("/Content/themes/base/jquery.ui.dialog.css")" rel="stylesheet" />
<link href="@Url.Content("/Content/themes/base/jquery.ui.datepicker.css")" rel="stylesheet" />
<form id="advisoryRequestForm">
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>BCRTAdvisoryRequest</legend>
<div class="container">
<div class="h-double">
<div class="editor-label">
@Html.LabelFor(m => m.RequestTypeID)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.RequestTypeID)<br />
@Html.DropDownListFor(m => m.RequestTypeID, (IEnumerable<SelectListItem>)ViewBag.RequestTypeID, "", null)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.DateRequested)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.DateRequested)<br />
@Html.TextBoxFor(model => model.DateRequested, new { @class = "datepickerfield", id = ViewBag.datepickeruid })
</div>
<div class="editor-label">
@Html.LabelFor(model => model.SiteName)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.SiteName)<br />
@Html.EditorFor(model => model.SiteName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ServiceCategoryID)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.ServiceCategoryID)<br />
@Html.DropDownListFor(m => m.ServiceCategoryID, (IEnumerable<SelectListItem>)ViewBag.ServiceCategoryID, "", null)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Description)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.Description)<br />
@Html.TextAreaFor(model => model.Description, new { style = "width:95%;min-height:80px;" })
</div>
</div>
<div class="h-double">
<div class="editor-label">
@Html.LabelFor(model => model.RequestedBy)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.RequestedBy)<br />
@Html.EditorFor(model => model.RequestedBy)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.JobTitle)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.JobTitle)<br />
@Html.EditorFor(model => model.JobTitle)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.LocalOfficeOrTeam)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.LocalOfficeOrTeam)<br />
@Html.EditorFor(model => model.LocalOfficeOrTeam)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.SiteVisit)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.SiteVisit)<br />
@Html.EditorFor(model => model.SiteVisit)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.StatusID)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.StatusID)<br />
@Html.DropDownListFor(m => m.StatusID, (IEnumerable<SelectListItem>)ViewBag.StatusID, "", null)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ConsultantRetained)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.ConsultantRetained)<br />
@Html.EditorFor(model => model.ConsultantRetained)
</div>
</div>
<div class="h-single">
<div class="editor-label">
@Html.LabelFor(model => model.Comments)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.Comments)<br />
@Html.TextAreaFor(model => model.Comments, new { style = "width:95%;min-height:80px;" })
</div>
</div>
</div>
</fieldset>
}
</form>
<script type="text/javascript">
$(document).ready(function () {
$('.datepickerfield').each(function () {
$(this).datepicker({ dateFormat: 'dd-mm-yy' });
});
});
</script>
实体框架生成的模型:
public partial class BCRTAdvisoryRequest
{
public int RequestID { get; set; }
[DataType(DataType.Date)]
public Nullable<System.DateTime> DateCreated { get; set; }
public int TeamMemberID { get; set; }
public int RequestTypeID { get; set; }
[DataType(DataType.Date)]
public System.DateTime DateRequested { get; set; }
public string SiteName { get; set; }
public int ServiceCategoryID { get; set; }
public string Description { get; set; }
public string RequestedBy { get; set; }
public string JobTitle { get; set; }
public string LocalOfficeOrTeam { get; set; }
public Nullable<bool> SiteVisit { get; set; }
public int StatusID { get; set; }
public Nullable<bool> ConsultantRetained { get; set; }
public string Comments { get; set; }
public int LastModifiedByID { get; set; }
public System.DateTime LastModifiedDate { get; set; }
public virtual User User { get; set; }
public virtual BCRTAdvisoryRequestServiceCategory BCRTAdvisoryRequestServiceCategory { get; set; }
public virtual BCRTAdvisoryRequestStatus BCRTAdvisoryRequestStatus { get; set; }
public virtual BCRTAdvisoryRequestType BCRTAdvisoryRequestType { get; set; }
public virtual User User1 { get; set; }
}
公共部分类BCRTAdvisoryRequest
{
public int RequestID{get;set;}
[数据类型(DataType.Date)]
公共可为空的DateCreated{get;set;}
public int TeamMemberID{get;set;}
public int RequestTypeID{get;set;}
[数据类型(DataType.Date)]
public System.DateTime DateRequested{get;set;}
公共字符串SiteName{get;set;}
公共int-ServiceCategoryID{get;set;}
公共字符串说明{get;set;}
{get;set;}请求的公共字符串
公共字符串JobTitle{get;set;}
公共字符串localofficeortam{get;set;}
可为空的公共站点访问{get;set;}
public int StatusID{get;set;}
公共可为空的ConsultantRetained{get;set;}
公共字符串注释{get;set;}
public int LastModifiedByID{get;set;}
public System.DateTime LastModifiedDate{get;set;}
公共虚拟用户用户{get;set;}
公共虚拟BCRTAdvisoryRequestServiceCategory BCRTAdvisoryRequestServiceCategory{get;set;}
公共虚拟BCRTAdvisoryRequestStatus BCRTAdvisoryRequestStatus{get;set;}
公共虚拟BCRTAdvisoryRequestType BCRTAdvisoryRequestType{get;set;}
公共虚拟用户User1{get;set;}
}
以及验证模型:
public partial class BCRTAdvisoryRequest
{
[MetadataType(typeof(BCRTAdvisoryRequest.MetaData))]
public sealed class MetaData
{
[Display(Name = "Date Created")]
[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}")]
public System.DateTime DateCreated { get; set; }
[Required]
[Display(Name = "Request Type")]
public int RequestTypeID { get; set; }
[Required]
[Display(Name = "Date Requested")]
[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}")]
public System.DateTime DateRequested { get; set; }
[Required]
[Display(Name = "Site Name")]
public string SiteName { get; set; }
[Required]
[Display(Name = "Service Category")]
public int ServiceCategoryID { get; set; }
[Required]
[Display(Name = "Description")]
public string Description { get; set; }
[Required]
[Display(Name = "Requested by")]
public string RequestedBy { get; set; }
[Required]
[Display(Name = "Job Title")]
public string JobTitle { get; set; }
[Display(Name = "Local Office/Team")]
public string LocalOfficeOrTeam { get; set; }
[Display(Name = "Site Visit")]
public Nullable<bool> SiteVisit { get; set; }
[Required]
[Display(Name = "Status")]
public int StatusID { get; set; }
[Display(Name = "Consultant Retained")]
public Nullable<bool> ConsultantRetained { get; set; }
[Display(Name = "Comments")]
public string Comments { get; set; }
}
}
公共部分类BCRTAdvisoryRequest
{
[元数据类型(typeof(BCRTAdvisoryRequest.MetaData))]
公共密封类元数据
{
[显示(Name=“创建日期”)]
[DisplayFormat(DataFormatString=“{0:dd-MMM-yyyy}”)]
public System.DateTime DateCreated{get;set;}
[必需]
[显示(Name=“请求类型”)]
public int RequestTypeID{get;set;}
[必需]
[显示(Name=“请求的日期”)]
[DisplayFormat(DataFormatString=“{0:dd-MMM-yyyy}”)]
public System.DateTime DateRequested{get;set;}
[必需]
[显示(名称=“站点名称”)]
公共字符串SiteName{get;set;}
[必需]
[显示(Name=“服务类别”)]
公共int-ServiceCategoryID{get;set;}
[必需]
[显示(Name=“Description”)]
公共字符串说明{get;set;}
[必需]
[显示(Name=“请求方”)]
{get;set;}请求的公共字符串
[必需]
[显示(Name=“职务”)]
公共字符串JobTitle{get;set;}
[显示(Name=“本地办事处/团队”)]
公共字符串localofficeortam{get;set;}
[显示(Name=“现场访问”)]
可为空的公共站点访问{get;set;}
[必需]
[显示(Name=“Status”)]
public int StatusID{get;set;}
[显示(名称=“保留顾问”)]
公共可为空的ConsultantRetained{get;set;}
[显示(Name=“注释”)]
公共字符串注释{get;set;}
}
}
至于行为,我希望这对于使用BCRTAdvisoryRequest类作为模型的局部视图来说是足够的信息,可以正确地进行验证,但显然不是
情况就是这样:
该对话框的问题是,一半的必填字段未经验证,所有标签均无效
局部视图编码如下:
@model EH.BCRT.AdvisoryRequests.Model.BCRTAdvisoryRequest
<link href="@Url.Content("/Content/Site.css")" rel="stylesheet" />
<link href="@Url.Content("/Content/themes/base/jquery.ui.dialog.css")" rel="stylesheet" />
<link href="@Url.Content("/Content/themes/base/jquery.ui.datepicker.css")" rel="stylesheet" />
<form id="advisoryRequestForm">
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>BCRTAdvisoryRequest</legend>
<div class="container">
<div class="h-double">
<div class="editor-label">
@Html.LabelFor(m => m.RequestTypeID)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.RequestTypeID)<br />
@Html.DropDownListFor(m => m.RequestTypeID, (IEnumerable<SelectListItem>)ViewBag.RequestTypeID, "", null)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.DateRequested)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.DateRequested)<br />
@Html.TextBoxFor(model => model.DateRequested, new { @class = "datepickerfield", id = ViewBag.datepickeruid })
</div>
<div class="editor-label">
@Html.LabelFor(model => model.SiteName)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.SiteName)<br />
@Html.EditorFor(model => model.SiteName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ServiceCategoryID)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.ServiceCategoryID)<br />
@Html.DropDownListFor(m => m.ServiceCategoryID, (IEnumerable<SelectListItem>)ViewBag.ServiceCategoryID, "", null)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Description)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.Description)<br />
@Html.TextAreaFor(model => model.Description, new { style = "width:95%;min-height:80px;" })
</div>
</div>
<div class="h-double">
<div class="editor-label">
@Html.LabelFor(model => model.RequestedBy)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.RequestedBy)<br />
@Html.EditorFor(model => model.RequestedBy)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.JobTitle)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.JobTitle)<br />
@Html.EditorFor(model => model.JobTitle)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.LocalOfficeOrTeam)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.LocalOfficeOrTeam)<br />
@Html.EditorFor(model => model.LocalOfficeOrTeam)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.SiteVisit)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.SiteVisit)<br />
@Html.EditorFor(model => model.SiteVisit)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.StatusID)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.StatusID)<br />
@Html.DropDownListFor(m => m.StatusID, (IEnumerable<SelectListItem>)ViewBag.StatusID, "", null)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ConsultantRetained)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.ConsultantRetained)<br />
@Html.EditorFor(model => model.ConsultantRetained)
</div>
</div>
<div class="h-single">
<div class="editor-label">
@Html.LabelFor(model => model.Comments)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.Comments)<br />
@Html.TextAreaFor(model => model.Comments, new { style = "width:95%;min-height:80px;" })
</div>
</div>
</div>
</fieldset>
}
</form>
<script type="text/javascript">
$(document).ready(function () {
$('.datepickerfield').each(function () {
$(this).datepicker({ dateFormat: 'dd-mm-yy' });
});
});
</script>
@model EH.BCRT.AdvisoryRequests.model.BCRTAdvisoryRequest
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
BCRTAdvisoryRequest
@LabelFor(m=>m.RequestTypeID)
@Html.ValidationMessageFor(model=>model.RequestTypeID)
@DropDownListFor(m=>m.RequestTypeID,(IEnumerable)ViewBag.RequestTypeID,“”,null)
@LabelFor(m=>m.DateRequested)
@Html.ValidationMessageFor(model=>model.DateRequested)
@TextBoxFor(model=>model.DateRequested,新的{@class=“datepickerfield”,id=ViewBag.datepickeruid})
@LabelFor(model=>model.SiteName)
@Html.ValidationMessageFor(model=>model.SiteName)
@EditorFor(model=>model.SiteName)
@LabelFor(model=>model.ServiceCategoryID)
@Html.ValidationMessageFor(model=>model.ServiceCategoryID)
@Html.DropDownListFor(m=>m.ServiceCategoryID,(IEnumerable)ViewBag.ServiceCategoryID,“,null)
@LabelFor(model=>model.Description)
@Html.ValidationMessageFor(model=>model.Description)
@text区域(model=>model.Description,新{style=“宽度:95%;最小高度:80px;”)
@LabelFor(model=>model.RequestedBy)
@Html.Valida
[MetadataType(typeof(BCRTAdvisoryRequest.MetaData))]
public partial class BCRTAdvisoryRequest
{
public sealed class MetaData
{