[英]How can I modify my view model to check validation for only specific properties?
我有一個問題,我將兩個模型傳遞到一個視圖模型中。 在特定視圖中,我只想檢查兩個屬性的驗證,一個來自視圖模型中的每個模型。
然而,這兩個模型都包含其他屬性,每個屬性都有自己的數據注釋,這意味着表單不會提交,直到所有注釋都得到滿足,即使它們不在表單上。
所以我需要找到一種方法來只檢查兩個模型中特定屬性的驗證,但如果它通過驗證檢查,仍然將整個對象保存到數據庫中。
代碼示例
楷模
public class FirstModel
{
public int Id { get; set; }
[Required]
public string Prop2 { get; set; }
[Required]
public DateTime Prop3 { get; set; }
}
public class SecondModel
{
public int Id { get; set; }
[Required]
public string Prop2 { get; set; }
[Required]
public int Prop3 { get; set; }
}
public class ThirdModel
{
public int Id { get; set; }
[Required]
public FirstModel FirstModel { get; set; }
[Required]
public SecondModel SecondModel { get; set; }
}
查看模型
public class ThirdFormViewModel
{
// maybe I can do something here?
public FirstModel FirstModel { get; set; }
public SecondModel SecondModel { get; set; }
}
控制器發布操作
[HttpPost]
public ActionResult CreateThirdModel(ThirdModel newThirdModel)
{
var firstModel = _context.FirstModels.Single(c => c.Id == newThirdModel.Id);
var secondModel = _context.SecondModels.Single(c => c.Id == newThirdModel.SecondModel.Id);
if (!ModelState.IsValid)
{
var viewModel = new ThirdFormViewModel
{
FirstModel = firstModel,
SecondModel = secondModel
};
return View("ThirdModelForm", viewModel);
}
var thirdModel = new ThirdModel
{
FirstModel = firstModel,
SecondModel = secondModel,
};
_context.ThirdModels.Add(thirdModel);
_context.SaveChanges();
return RedirectToAction("Index");
}
看法
@model MyProject.ViewModels.ThirdFormViewModel
@using (Html.BeginForm()
{
<div class="form-group">
@Html.TextBoxFor(m => m.FirstModel.Prop2)
</div>
<div class="form-group">
@Html.TextBoxFor(m => m.SecondModel.Prop3)
</div>
<button type="submit" class="btn btn-primary">Save</button>
}
您可以使用ModelState.Remove刪除要驗證的屬性。
由於您的第三個視圖模型包含其他兩個模型的屬性,因此屬性名稱應類似於FirstModel.Prop2
,這可以通過ModelState.Values
在調試器中進一步檢查
例子:
ModelState.Remove("FirstModel.Prop2");
ModelState.Remove("SecondModel.Prop2");
您可以刪除 ModelState.IsValid 檢查並自己驗證數據。 如果您只需要驗證 2 個屬性,那看起來是更簡單的方法
如果是我,我會創建多個視圖模型,而不是直接傳遞對象,這樣您就可以更好地控制像這樣的場景所做的事情。 我通常嘗試為所有傳遞的數據創建視圖模型。 看起來您必須映射很多實體,但它可以防止實體模型變得混亂。 您可以控制從視圖中驗證您需要的任何內容,因為 DTO 對象不會在其他任何地方共享。 您可以將數據注釋保留在實體對象中以用於實體框架。
有時您可能希望在視圖模型上創建一個對象,而不是在 Entity 或類似的東西中。
如果您的對象很大,您可以使用 AutoMapper 來幫助映射對象,從而減少您的工作量。
查看模型
public class FirstViewModel
{
public int Id { get; set; }
public string Prop2 { get; set; }
public DateTime Prop3 { get; set; }
}
public class SecondViewModel
{
public int Id { get; set; }
public string Prop2 { get; set; }
public int Prop3 { get; set; }
}
public class ThirdFormViewModel
{
public FirstViewModel FirstModel { get; set; }
public SeconViewdModel SecondModel { get; set; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.