在MVC中进行模型验证之前预处理表单数据

时间:2015-02-10 15:18:16

标签: c# asp.net-mvc validation asp.net-mvc-4

我对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("&nbsp;") @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个更易于管理的其他属性。只有这些列表才会导致问题。

任何帮助表示赞赏!

戴夫

0 个答案:

没有答案