我正在研究一个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;。
有人可以帮忙吗?
答案 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>
<% } %>