我对MVC很新,但在开发方面有相当多的经验,而且看起来我的MVC请求生命周期有问题。
试图保持这一点,即使项目在某些方面有点复杂。
我有一个视图绑定到具有一些复杂列表属性的视图模型。这些属性通过复选框显示,这些复选框的ID与模型中的任何属性不直接相关,而是与List<>中的对象的ID相关。因此,检查的值不会自动应用于POST上的模型。
为了解决这个问题,我在控制器的Action方法中添加了代码,该代码解析了正确的控件(在Request.Form集合中),并将选中/选中的值分配给模型中的正确列表项。
这完全符合要求。
现在,我还使用了Fluent验证,问题在于在将新模型发布到服务器时执行自定义验证规则。验证例程在控制器的操作方法之前触发,因此在处理列表对象之前触发。
所以,我的问题是,有没有办法可以覆盖模型验证的初始调用,所以我可以在处理后手动调用验证?我知道我可以做到这一点来解决问题而不会覆盖初始调用,但是一些验证需要一些时间来处理,因为它需要linq查询到实时数据库,所以我不希望验证发生2次 - 无论模型是否有效,这将使返回所需的时间翻倍。
编辑:添加示例:
namespace Models
{
[Validator(typeof(MemberValidator))]
public class ViewMember
{
public int MemberID { get; set; }
public short RegionID { get; set; }
public List<PropTypeInfo> PropTypes { get; set; }
}
}
PropTypeInfo类:
public class PropTypeInfo
{
public byte ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public bool Selected { get; set; }
public PropTypeInfo(byte i, string n, string d, bool sel)
{
ID = i;
Name = n;
Description = d;
Selected = sel;
}
public static List<PropTypeInfo> GetAll(bool selected = false)
{
List<PropTypeInfo> output = new List<PropTypeInfo>();
OpenAccess.Context context = new OpenAccess.Context();
var list = (from f in context.Prop_Types orderby f.PropType select f).ToList();
foreach (OpenAccess.WebrentzServerPayments.Models.Prop_Type p in list)
output.Add(new PropTypeInfo(p.PropType, p.PropName, p.DisplayText, selected));
return output;
}
}
现在这里是视图中的代码,它为列表中的每个项目呈现复选框:
<div class="Column Emp-PropTypes">
@foreach (WebrentzServerPayments.Models.PropTypeInfo ptype in Model.PropTypes)
{
<div style="float:right;width:20%;font-weight:bold;">
@Html.CheckBox("ptype_" + ptype.ID, ptype.Selected, new {Value=ptype.ID}) @Html.Raw(" ") @ptype.Name
</div>
}
</div>
以下是我在Controller Action方法中使用的代码,用于将数据提取回List:
foreach (PropTypeInfo info in member.PropTypes)
info.Selected = form[string.Format("ptype_{0}", info.ID)].Contains(info.ID.ToString());
作为一个小背景,“PropType”是一种属性(房屋,公寓,公寓) - 大约有二十几个,并且可以随时添加/删除更多。名为“PropTypes”的类中的列表首先使用数据库中的表中的名称,描述和ID进行填充,该表列出了该区域的所有可用的proptypes。
如果用户选择了特定类型,我们会将proptypes标记为“已选择”。这些保存到名为Member.PropTypes(MemberID,ProptypeID)的表中。
因此,在运行时,列表将包含每个可用proptype的一条记录,如果该用户已选择它,则selected属性将设置为yes。这样可以轻松地在视图中呈现完整列表...
它实际上相当复杂,因为有几十个这样的列表,但每个列表只使用不同的数据,以及大约200个更易于管理的其他属性。只有这些列表才会导致问题。
任何帮助表示赞赏!
戴夫