MVC驗證基礎(與實體框架)MVC驗證基礎(與實體框架)
場景:
我有如下的模型類(通過實體框架EF.x的DbContext發生器自動生成的)。
(有此刻沒有視圖模型)。
public partial class Activity
{
public int Id { get; set; }
public byte Progress { get; set; }
public decimal ValueInContractCurrency { get; set; }
public System.DateTime ForecastStart { get; set; }
public System.DateTime ForecastEnd { get; set; }
public int DepartmentId { get; set; }
public int OwnerId { get; set; }
public int StageId { get; set; }
public int StatusId { get; set; }
public virtual Department Department { get; set; }
public virtual Owner Owner { get; set; }
public virtual Stage Stage { get; set; }
public virtual Status Status { get; set; }
}
當我提交的強類型視圖中的空白表格,我得到這些驗證消息:
進展場是必需的。
的ValueInContractCurrency字段是必需的。
ForecastStart字段是必需的。
ForecastEnd字段是必需的。
即db表中的所有字段。
如果我填補這些和提交一次,則控制器被調用。由於IsValid爲false,控制器然後返回到視圖頁面。
屏幕,然後用這些驗證消息重新顯示:需要
的級ID字段。
DepartmentId字段是必需的。
StatusId字段是必需的。
OwnerId字段是必需的。
即所有的外鍵的數據庫表字段(這些也都選擇框)。
如果我填寫這些表單,然後提交成功,並保存到數據庫。
問題:
在哪裏驗證從哪裏來的,因爲我沒有使用任何[必需]屬性?這是與實體框架有關嗎?
爲什麼表單不能立即驗證客戶端的所有內容,即使它們是空的,因此顯然是無效的,它們僅由IsValid()檢查的外鍵(或選擇框)有什麼不同?
你如何讓所有事情在一個步驟中得到驗證(對於空字段),所以用戶不必一次提交表單兩次,並且所有驗證消息一次顯示?你是否必須關閉客戶端驗證?
(我嘗試添加[必需]屬性外鍵的字段,但是這似乎沒有什麼差別(大概只會影響的IsValid)。我也打過電話Html.EnableClientValidation(),但也沒有任何區別)。
4.最後,我看到有人使用[MetadataType [MetadataType(typeof(...)]]進行驗證。如果您有視圖模型,或者只有當您不使用視圖模型時, t?
顯然我在這裏錯過了一些基礎知識,所以除此之外,如果有人知道關於MVC驗證過程如何工作的詳細教程,包括javascript/controller調用的逐步步驟,而不僅僅是另一篇文章屬性的話,我可以做一個鏈接,太:C)
更多信息的空軍終於男人:
解設置如下:
.NET4
MVC3
EF5
EF5.x Db的上下文產生
「添加代碼生成物品」 上EDMX設計表面以用於關聯EF.x Db上下文生成器文件(.tt文件)
控制器看起來像th是:
// GET: /Activities/Create
public ActionResult Create()
{
ViewBag.DepartmentId = new SelectList(db.Departments, "Id", "Name");
ViewBag.OwnerId = new SelectList(db.Owners, "Id", "ShortName");
ViewBag.ContractId = new SelectList(db.Contracts, "Id", "Number");
ViewBag.StageId = new SelectList(new List<string>());
ViewBag.StatusId = new SelectList(db.Status.Where(s => s.IsDefaultForNewActivity == true), "Id", "Name");
return View();
}
// POST: /Activities/Create
[HttpPost]
public ActionResult Create(Activity activity)
{
if (ModelState.IsValid)
{
db.Activities.Add(activity);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.DepartmentId = new SelectList(db.Departments, "Id", "Name");
ViewBag.OwnerId = new SelectList(db.Owners, "Id", "ShortName");
ViewBag.ContractId = new SelectList(db.Contracts, "Id", "Number");
ViewBag.StageId = new SelectList(db.Stages, "Id", "Number");
ViewBag.StatusId = new SelectList(db.Status, "Id", "Name");
return View(activity);
}
觀是這樣的:
<!-- this refers to the EF.x DB Context class shown at the top of this post -->
@model RDMS.Activity
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Activity</legend>
<div class="editor-label">
@Html.LabelFor(model => model.StageId, "Stage")
</div>
<div class="editor-field">
@Html.DropDownList("StageId", String.Empty)
@Html.ValidationMessageFor(model => model.StageId)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Progress)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Progress)
@Html.ValidationMessageFor(model => model.Progress)
</div>
<!-- ETC...-->
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
順便說一句,對不起,因爲這裏的所有地方,但有點失去了這... – jimasp
顯然還有其他事情在這裏。你所展示的不應該給出這些結果。你有沒有添加任何其他包到你的項目?您是否使用任何自定義模型活頁夾或價值活頁夾?你的行爲方法是什麼樣子的?獲取和發佈。 –
添加更多信息 – jimasp