哪个是MVC3中最好的自定义错误消息系统?

时间:2013-09-05 23:59:07

标签: c# asp.net-mvc-3

我正在研究一个MVC3项目。我有一个控制器,我在那里做一些错误检查。这部分正在努力将各种约束应用于用户输入。不幸的是,我不能使用javascript,因为在用户提交表单之后才会分配id。

这个id对于错误检查至关重要,所以我在控制器中完成了这个。

因此,当每个错误发生时,我形成一个我想传递给视图的错误消息。视图是强类型的实体。

我的问题是我应该选择哪种选择? ViewState,View Bag,TempData或ModelState?

基本上,我有一个准备好的错误消息,我希望在我的视图中的asp:Label中显示。到目前为止,我已经尝试过:

ViewBag.ErrMsg = "The client must be over 18 to open a TFSA.";

然后在我看来

 <% if (ViewBag.ErrMsg != "")
           { %>
       <div class="errorMsg"><asp:Label ID="Label1" runat="server" Text="<%ViewBag.ErrMsg %>" ></asp:Label>
    </div>
    <% } %>

但显然只返回引号之间的任何内容,即&lt;%ViewBag.ErrMsg%&gt;。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您希望验证您的模型,因此在我看来,使用ModelState是很自然的,因为它是专门为此目的而设计的。

您应该做的第一件事是为您的实体创建buddy class。此对象通过添加元数据来扩展您的实体框架实体,因此,如果您需要重新生成实体,则您的自定义设置不会丢失。因此,如果您的实体被称为Client,那么您将拥有以下内容:

 //This extends the Entity Framework entity thanks to the `partial` keyword
 [MetadataType(typeof(ClientMetadata))]
 public partial class Client { }

 //This class applies metadata through data annotations that validates your model
 public partial class ClientMetadata{
     //Let's say we want to add a couple validation rule to the client's age 
     [Required(ErrorMessage="Age is required")]
     [Range(19,100,ErrorMessage="Your age must be between 19 and 100")] 
     public int Age { get;set; }
 }

现在已经使用好友类扩展了Client,ModelState验证会自动启动。在你的控制器动作中,你通常会有类似的东西:

  [HttpPost]
  public ActionResult Update(Client client){
      //During model binding, validation is performed on client
      if(!ModelState.IsValid){
           return View(client);
      }
      return RedirectToAction("Index");
  }

如果您有验证错误,那么您可以使用视图中的ValidationSummary来显示它们,这会将所有错误打印到列表中:

  @Html.ValidationSummary()

此示例略微偏离您的用例,因为使用内置的RangeAttribute数据注释,我提供了年龄的最大数字,因为没有用于最小值的烘焙数据注释。如果您需要,请告诉我,我会告诉您如何。我现在在秘鲁的一家旅馆,因为这里的互联网不是很好而且我的上网本没有我的旧项目,所以我正在匆匆忙忙工作。)

答案 1 :(得分:0)

这不是很漂亮,但它“有效”:

 if (CreateFlag == false)
            {
                TempData["ErrorMessage"] = "The client must be over 18 to perform this action.";
                return RedirectToAction("DrinkCreate", "Drink");
            }

并在视图中:

 <% if (TempData.ContainsKey("ErrorMessage"))
           { %>
                <div class="errorMsg"><%= TempData["ErrorMessage"] %></div>        
        <% } %>