0

我正在做一个 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>
    <% } %>

但显然只返回引号之间的任何内容,即 <%ViewBag.ErrMsg %>。

有人可以帮忙吗?

4

2 回答 2

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>        
        <% } %>
于 2013-09-06T14:43:52.913 回答
0

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

您应该做的第一件事是buddy class为您的实体创建一个。此对象通过添加元数据来扩展您的 Entity Framework 实体,因此如果您需要重新生成实体,您的自定义设置不会丢失。所以,如果你的实体被称为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数据注释,我为年龄提供了一个最大值,因为没有针对最小值的烘焙数据注释。如果你需要一个,请告诉我,我会告诉你怎么做。我现在在秘鲁的一家旅馆里,我在胡思乱想,因为这里的互联网不是很好,而且我在上网本上没有我的旧项目 :)

于 2013-09-06T00:50:28.370 回答