C# MVC3中使用的最佳自定义错误消息系统是什么?

C# MVC3中使用的最佳自定义错误消息系统是什么?,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我正在做一个MVC3项目。我有一个控制器,我在那里做一些错误检查。这一部分工作到了我将各种约束应用于用户输入的程度。不幸的是,我不能使用javascript,因为只有在用户提交表单后,才会分配id 这个id对于错误检查至关重要,所以我在控制器中完成了这项工作 因此,每次发生错误时,我都会形成一条错误消息,希望传递给视图。视图被强类型化为实体 我的问题是我应该使用哪种选择?视图状态、视图包、TempData还是ModelState 基本上,我有一个准备好的错误消息,我想在视图中的asp:标签中显示

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

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

因此,每次发生错误时,我都会形成一条错误消息,希望传递给视图。视图被强类型化为实体

我的问题是我应该使用哪种选择?视图状态、视图包、TempData还是ModelState

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

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>
    <% } %>

但是很明显,只要返回引号之间的内容,就可以了


有人能帮忙吗?

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

您应该做的第一件事是为您的实体创建一个
好友类
。此对象通过添加元数据扩展实体框架实体,以便在需要重新生成实体时,不会丢失自定义设置。因此,如果您的实体被称为
客户机
,您将有如下内容:

 //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
已经通过buddy类进行了扩展,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
数据注释,我为年龄提供了一个最大值,因为最小值没有烘焙的数据注释。如果你需要,请告诉我,我会告诉你怎么做。我现在在秘鲁的一家旅馆里,由于这里的互联网不太好,而且我在上网本上没有我的老项目,所以我脑子里乱七八糟:)

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

 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>        
        <% } %>


asp:Label
runat=“server”
在asp.net-mvc中通常不受欢迎。为什么在MVC应用程序中使用webform控件?是的,我知道。我无法控制(请原谅我的双关语!)。谢谢克里斯。如果我们重新编写应用程序,这将是非常好的,但不幸的是,我们没有这种奢侈。我已经在控制器中完成了逻辑。基本上,我所要做的就是从控制器抓取错误消息并将其显示在我的视图中。我们没有使用Razor,因此在我的原始帖子中使用了。我想我不太理解您的限制。如果不能使用Razor,仍然可以使用ValidationSummary对象。你不能触摸哪些部位?您是否无法创建好友类?数据注释确实是验证的理想方式,而违反控制器中的规则违反了单一责任的概念。