我有一個EF Code First模型,我正在通過MVC頁面進行編輯,其中一個特定的字段總是通過[Required]數據註釋返回false。如果我在驗證之前很難設置一個值,它仍然會失敗。必需的驗證器總是返回false
這是一個用戶對象,如果我使用用戶名或電子郵件地址作爲'用戶名'屬性,我可以對其進行配置。
型號:
public class User {
[DisplayName("User Id")]
public int Id { get; set; }
[Required(ErrorMessage="Username is required")]
public string Username { get; set; }
[UIHint("EmailAddress")]
[Required(ErrorMessage = "Email is required")]
[EmailAddress]
public string Email { get; set; }
}
在我看來,我只是繪製Username
編輯器,如果它需要:
@if (@ViewBag.LoginMethod == "username") {
@Html.LabelFor(m => m.Username)
@Html.TextBoxFor(m => m.Username, new { autocomplete = "off" })
@Html.ValidationMessageFor(m => m.Username)
}
@Html.LabelFor(m => m.Email)
@Html.TextBoxFor(m => m.Email, new { autocomplete = "off" })
@Html.ValidationMessageFor(m => m.Email)
我的控制器:
[HttpPost]
public ActionResult Create(UserModel viewModel) {
ViewBag.LoginMethod = this.loginMethod.ToString();
var user = new User();
if (this.loginMethod == LoginMethods.Username)
user.Username = viewModel.User.Username;
else
user.Username = viewModel.User.Email;
user.Email = viewModel.User.Email;
user.FirstName = viewModel.User.FirstName;
user.LastName = viewModel.User.LastName;
user.Username = "TEST";
if (TryValidateModel(user) == false) {
this.FlashError("Validation Errors!");
return View(viewModel);
}
throw new Exception("here");
}
,你可以請參閱我將根據登錄方法設置User.Username屬性。爲了測試,我將它設置爲「測試」,就在驗證之前。 用戶名必填驗證返回false,最後回到我的視圖。我從來沒有得到例外。
我已經設法使它正常工作,通過在頁面上呈現用戶名編輯器,無論如何。由於我啓用了客戶端驗證,因此我無法提交表單而沒有輸入值,並且它可以工作 - 即使用戶名值在驗證後仍然是「測試」。
我開始認爲TryValidateModel
不是正確的功能。使用ModelState.IsValid
會得到相同的結果 - 錯誤的必需失敗。
我有兩個模型在viewmodel,用戶和一個成員對象,它有認證信息(密碼,登錄時間戳等)。我認爲你對「增加的安全功能」是正確的。在這一點上,我正在創建一個新的User對象,並手工從FormCollection中填充它。 – mattdwen
我很抱歉,延遲響應(我仍然習慣於接口)。它是如何去的?如果您沿着手動人口路線走下去了,如果您創建ModelBinder,則可能更有趣。通過這種方式,您可以在發送用戶對象的任何地方重複使用此代碼。另外,ModelBinder有一些有趣的受保護的方法可以幫助手動填充。 –