簡體   English   中英

如何修改我的視圖模型以僅檢查特定屬性的驗證?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM