zoukankan      html  css  js  c++  java
  • MVC中ModelState的使用

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

     

    ModelState的内容何时被修改:

    模型绑定时; 每一个值在模型状态中都有相应的一条记录。可以随时查看绑定状态

    MVC控制器中语句赋值,例如  ModelState.AddModelError("Password","密码错误");

    ModelState的属性

    Errors :返回一个 ModelErrorCollection 对象,该对象包含在模型绑定期间发生的所以错误【绑定验证,所以错误】

    Value:返回一个 ValueProviderResult 对象,该对象封装在模型绑定期间绑定的值。例如模型错误,重新回到输入界面时原来输入的值会显示

    错误有模型级和属性级:

    ModelState.IsValid
    ModelState.IsValidField("Name")

    Html 辅助方法和ModelState集成

    HTML 辅助方法,如Html.TextBox(),在输出内容时,会检查ModelState集合。如果发现该属性有异常或错误,将呈现用户输入的内容和CSS错误类

     例如,在Edit视图中,我们使用Html.TextBox() 辅助方法呈现Dinner对象的EventDate属性:
     
    <%= Html.TextBox("EventDate", String.Format("{0:g}", Model.EventDate)) %>
     
    当有错的时候呈现视图时,Html.TextBox() 方法检查ModelState集合,检查是否有错误关联到Dinner 对象的EventDate属性。当发现有错误时,将显示用户提交的”EntLib” 输入作为参数值,同时对<input type=”textbox” />元素添加CSS 错误类,如下所示:
     
    <input class="input-validation-error" id="EventDate" name="EventDate"
    type="text" value="BOGUS" />
     
    你可以定制CSS错误类的样式。默认的CSS错误类 – input-validation-error定义在contentsite.css 文件中,样式定义如下:
     
    .input-validation-error
    {
    border: 1px solid #ff0000;
     
    }
     

    Html.ValidationMessage() 辅助方法

     
    Html.ValidationMessage() 辅助方法用来输出特定Model属性相关的ModelState错误信息
     
    <%= Html.ValidationMessage("EventDate") %>
     
    上述代码输出:
     
    <span class=”field-validation-error”> The value ‘EntLib’ is invalid</span>
     
    Html.ValidationMessage() 辅助方法也支持第二个参数,允许开发人员覆盖错误消息:
     
    <%= Html.ValidationMessage("EventDate", "*") %>
    上述代码输出:
     
    <span class=”field-validation-error”> *</span>,而不是默认的错误信息。
     
     
     

    Html.ValidationSummary() 辅助方法

     
    Html.ValidationSummary() 辅助方法将呈现总结的错误消息,通过<ul><li/></ul>元素列出在ModelState集合中所有详细的错误消息
    Html.ValidationSummary() 辅助方法接收一个可选的字符串参数 – 定义一个概括性的错误消息,并显示在所有详细错误信息的前面:
     
    <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
    你也可以定义CSS设置错误消息的样式。
     
     
     

    使用AddRuleViolations辅助方法

     
    初始的HTTP-POST Edit的实现方法使用了一个foreach循环语句,遍历Dinner对象的Rule Violations,并添加到controller的ModelState集合:
     
    复制代码
    catch
    {
      foreach (var issue in dinner.GetRuleViolations())
      {
        ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
      }
      return View(dinner);
    }
    复制代码
     
    为了使代码更简洁一点,我们添加ControllerHelpers类到NerdDinner项目中,并实现了AddRuleViolations扩展方法,添加了一个对ASP.NET MVC ModelStateDictionary 类的辅助方法。该扩展方法封装了使用RuleViolation 错误信息填充ModelStateDictionary 集合类的逻辑:
     
    复制代码
    public static class ControllerHelpers
    {
      public static void AddRuleViolations(this ModelStateDictionary modelState,IEnumerable<RuleViolation> errors)
      {
        foreach (RuleViolation issue in errors)
        {
            modelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
        }
      }
    }
    复制代码
     
    接下来,我们更新HTTP-POST Edit方法,使用上述扩展方法实现Dinner的Rule Violations填充ModelState集合。
     
     
     

    完成Edit Action方法的实现

     
     
    下面的代码实现了控制器中Edit的所有逻辑:
     
    复制代码
                            
    //
    // GET: /Dinners/Edit/2
    public ActionResult Edit(int id)
    {
    Dinner dinner = dinnerRepository.GetDinner(id);
    return View(dinner);
    }
     
    //
    // POST: /Dinners/Edit/2
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, FormCollection formValues) 
    {
    Dinner dinner = dinnerRepository.GetDinner(id);
     
    try
    {
    UpdateModel(dinner);
    dinnerRepository.Save();
    return RedirectToAction("Details", new { id = dinner.DinnerID });
    }
    catch
    {
    ModelState.AddRuleViolations(dinner.GetRuleViolations());
    return View(dinner);
    }
    }
    
                        
    复制代码
    关于Edit方法的实现的优点,不仅Controller类,而且View视图模板都不必关心Dinner模型类的特定验证方法或者业务规则。以后,我们可以针对Model类增加额外的业务规则,而不必要求Controller和View更改代码。这样,我们可以根据需求,以最小的更改代码量,灵活改进应用程序。
  • 相关阅读:
    java集合总结
    css基础:块级元素与行内元素
    第九周web作业:history of grammar
    正则表达式(regular expression rules)
    用indexOf查找字符出现次数
    DOM与BOM的概念
    css的单位以及调色法
    获取登录cookieColletion在cef里面打开网页
    引用CefSharp编译支持AnyCpu的办法
    解决H5移动端history.back无效
  • 原文地址:https://www.cnblogs.com/wfy680/p/12322944.html
Copyright © 2011-2022 走看看