MVC通用搜索和模型验证问题

时间:2011-06-06 14:05:15

标签: asp.net-mvc search validation

我将解释一般情况。为了解释我的问题,我要求一些耐心,直到我解释我是如何实现我的搜索页面。我有一个[Users]表和一个[Address]表,基于这个表我在SQL中派生了一个 VIEW - [vw_User_Addr] 。我正在使用L2S,因此我将获得一个强类型的vw_User_Addr类。

现在我有一个搜索页面,所以显然我会从这个类派生出来,如:

<%@ Page Title="User Search" ... Inherits="System.Web.Mvc.ViewPage<MyDAL.vw_User_Addr>" %>

My List操作返回一个List,我在View中使用它来形成Grid表。一切都很好,直到这里。现在我想在这个页面上实现搜索。所以这就是我发现的 -

  • 在列表操作期间在Controller中创建ViewData [“Usr”] = new vw_User_Addr();
  • 在我的观点中我做了:

      

    &lt;%MyDAL.vw_User_Addr usr =   ((MyDAL.vw_User_Addr)(计算机[ “USR”]));   %GT;

  • 然后我使用这个“usr”对象绑定我的搜索控件,如:

      

    &lt;%= Html.TextBox(“FirstName”,   usr.FirstName)%&GT;

  • 最后在我的HttpPost处理程序操作中,我对象vw_User_Addr:

      

    [HttpPost]公共ActionResult   列表(vw_User_Addr searchObj){...}

  • 我使用此searchObj提取用户可能在搜索控件中填充的值,然后执行搜索。


所以,我希望我解释得很好。这就是我在MVC2中搜索的方式。这是我的关注/问题

  1. 当我点击搜索图片按钮时,我得到一个回发但它会触发一个给出错误的ModelValidation。除了至少那些是int(即像Roles下拉搜索控件)之外的所有内容都没有 - 如何处理?

  2. 经过大量研发后,我已经确定我要做一个ModelState.Clear();或者更复杂的方式来处理这个问题。还有更好的选择吗?

  3. 有没有更好的方法来实现上面解释的搜索实现?我是否使用标准\最佳方式在MVC中进行搜索?

  4. 在核心级别,我是否可以让L2S了解这是一个SQL-View,因此其Readonly和所有字段都可以为NULL - 因此 Mr.DefaultModelValidator 不会执行这种不合逻辑的验证?

  5. 如果4.是否可行,我可以将L2S视图中所有字段的属性设置为只读吗?

  6. 感谢您宝贵的时间和审查。如果我不在赛道上,请指导我。我相信这是最简单的搜索方案,所以它必须很容易。只需要找到缺失的链接。

1 个答案:

答案 0 :(得分:0)

我实施了 ActionFilterAttribute [SkipModelValidation],避免/消除了搜索页面不需要的模型验证。

参考: How to disable validation in a HttpPost action in ASP.NET MVC 3?

public class SkipModelValidationAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //Get ModelState
            ModelStateDictionary dict = ((Controller)filterContext.Controller).ModelState;

            if (dict != null && !dict.IsValid)
                dict.Clear();

            base.OnActionExecuting(filterContext);
        }
    }