商会资讯

 找回密码
 立即注册

QQ登录

只需一步,快速开始

用新浪微博连接

一步搞定

搜索
热搜: 活动 交友 discuz

ASP.NET MVC实践系列3-服务器端数据验证

已有 2276 次阅读2009-12-29 16:00

我们这里主要讲解asp.net mvc中服务器端得数据验证,至于客户端验证我们会在以后的系列中讲到。

  在controller中有一个modelstate属性,这是一个类型为modelstatedictionary的modelstate类型的字典集合。在进行数据验证的时候这个属性是比较有用的。在使用html.validationmessage()的时候,就是从modelstate中检测是否有指定的key,如果存在,就提示错误信息。

  1、基本实例

  在view中添加如下文件

<%= html.validationsummary("edit was unsuccessful. please correct the errors and try again.") %>


  <%= html.validationsummary("edit was unsuccessful. please correct the errors and try again.") %>
    <% using (html.beginform()) {%>
        <fieldset>
            <legend>fields</legend>
            


                <label for="id">id:</label>
                <%= html.textbox("id", model.id) %>
                <%= html.validationmessage("id", "*") %>
            


            


                <label for="title">title:</label>
                <%= html.textbox("title", model.title) %>
                <%= html.validationmessage("title", "*") %>
            


             


                <input type="submit" value="save" />
            


        </fieldset>
    <% } %>
  <% } %>

  在相应的controller中添加如下代码


 public actionresult newsedit(int id)
  {
  newsdatadatacontext dc = new newsdatadatacontext();
  return view(dc.news.first(n => n.id == id));
  }
  [acceptverbs(httpverbs.post)]
  public actionresult newsedit(int id, formcollection formvalues)
  {
  news news = new news();
  updatemodel(news);
  if (string.isnullorempty(news.title))
  {
  modelstate.addmodelerror("title", "title不能为空");
  }
  else
  {
  //进行更新
  }
  return view(news);
  }

  view中使用html.validationmessage(string modelname)来对指定的属性进行验证:这里仍然使用的是mvc中默认的约定,modelname的内容如果和modelstate中的key值一样是就显示。

  其中validationsummary()是用于显示全部的验证信息的。跟asp.net里面的validationsummary验证控件差不多。

  运行程序得到的结果为:

  asp.net mvc实践系列3-服务器端数据验证

  html.validationmessage()方法会为出错的属性的输入框添加一个名为"input-validation-error"的css类,同时后面的提示信息的css类名为"field-validation-error":


  <input class="input-validation-error" id="title" name="title" type="text" value="" />
                <span class="field-validation-error">*

  css类的样式是可以由我们自己自由定义的

   我们这里主要讲解asp.net mvc中服务器端得数据验证,至于客户端验证我们会在以后的系列中讲到。

  2、应用

  这里我们为之前的news实例添加服务器端验证,首先我们需要一个传递错误信息的类


public class ruleviolation
  {
  public string errormessage { get; private set; }
  public string propertyname { get; private set; }
  public ruleviolation(string errormessage)
  {
  errormessage = errormessage;
  }
  public ruleviolation(string errormessage, string propertyname)
  {
  errormessage = errormessage;
  propertyname = propertyname;
  }
  }

  然后为dbml中的news类添加一个partial类,来用于验证属性


 public partial class news
  {
  public bool isvalid
  {
  get { return (getruleviolations().count() == 0); }
  }
  partial void onvalidate(changeaction action)
  {
  if (!isvalid)
  throw new applicationexception("rule violations prevent saving");
  }
  public ienumerable getruleviolations()
  {
  if (string.isnullorempty(title))
  yield return new ruleviolation("必须要输入标题", "title");
  if (string.isnullorempty(author))
  yield return new ruleviolation("必须要输入作者", "author");
  yield break;
  }
  }

     controller中填入如下代码


 [acceptverbs(httpverbs.post)]
  public actionresult newsedit(int id, formcollection formvalues)
  {
  newsdatadatacontext dc = new newsdatadatacontext();
  news news = dc.news.first(n => n.id == id);
  try
  {
  updatemodel(news);
  dc.submitchanges();
  return redirecttoaction("details", new { id = id });
  }
  catch (exception)
  {
  foreach (var issue in news.getruleviolations())
  {
  modelstate.addmodelerror(issue.propertyname, issue.errormessage);
  }
  return view(news);
  }
  }

  注:当对datadatacontext执行submitchanges方法时会触发onvalidate分布方法。

 

    

收藏 分享邀请 转发到微博 举报

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

回顶部