4

私たちのアプリケーションには、検証用の DataAnnotations を持つクラスを含むドメイン層があります。

ASP.NET MVC ui レイヤーのモデルでこれらのクラスを使用しています。

例えば:

ドメイン層:

public class Company
{
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string Description { get; set; }

    // ... some model logic abreviated
}

public class Supplier 
{
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public Company Company { get; set; }

    // ... some model logic abreviated
}

ASP.NET MVC プレゼンテーション層では:

public class SupplierEditModel
{
    public Supplier Supplier { get; set; }
    public IEnumerable<Company> Company { get; set; }
    public int SelectedCompany { get; set; }

    // ... some model logic abreviated
}

この場合、企業の DropDownList を含むページがあります。リストは次のようにバインドされます。

@Html.DropDownListFor(m => m.SelectedCompany, new SelectList(Model.Companies, "Id", "Description", Model.SelectedCompany))

私たちの問題は、コントローラーの POST メソッドにあります。ModelState.IsValid をチェックしているとき、Supplier.Company が null であるため、モデルは有効ではありません。その後、SelectedCompany を使用して会社を取得できますが、問題は、次のようなことができないことです。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(SupplierEditModel model)
{
    if (ModelState.IsValid)
    {
        model.CreateSupplier(_supplierService);
        return RedirectToAction("Index");
    }

    return RedirectToAction("Create");
}

サプライヤーを作成する前に検証を使用したいと考えています。

4

3 に答える 3

4

(少なくとも) 2 つのオプションがあるようです。

Supplier.Companyビュー モデルをフラット化し、ビューで必要ない場合は省略することができます。

public class SupplierEditModel
{
    public int SupplierId { get; set; }
    public string Name { get; set; }
    public Company Company { get; set; }
    public IEnumerable<Company> Company { get; set; }
    public int SelectedCompany { get; set; }

    // ... some model logic abreviated
}

(注: データの注釈は、ドメイン モデルではなく、ビュー モデルにある必要があります。)

また

プロパティModelStateをチェックする前にエラーをクリアできますIsValid

ModelState.Remove(string key, ModelState);

ここでのベスト プラクティスは、2 つの理由から、おそらくフラット化されたモデルを使用することです。1 つ目は、一般的に、必要なものだけをビューに送信し、それ以上のものを送信しないことです。ビューが Supplier.Company で何もしていない場合、それはモデルの一部であってはなりません。2 つ目は、ModelState.Remove メソッドを使用することです。これは効果的ではありますが、少しぎこちないと見なされる場合があります。コードレビューであなたのチョップが少し壊れるかもしれません;)

于 2013-02-22T15:04:28.027 に答える
2

以下をチェックする前にCompanyから削除できます。ModelStateIsValidModelState.Remove("Supplier.Company")

于 2013-02-22T15:06:03.920 に答える
-1
   public class OrderViewModel
    {
        [Display(Name = "Customer")]
        [Required(ErrorMessage = "Please select customer.", AllowEmptyStrings = false)]
        public string CustomerName { get; set; }

        public IEnumerable<CustomerViewModel> Customers { get; set; }
    }


   public class CustomerViewModel
    {
        public string CustomerID { get; set; }
        public string CompanyName { get; set; }
    }

     <div class="form-group">
        @Html.LabelFor(m => m.CustomerName, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.DropDownListFor(m => m.CustomerName, new SelectList(Model.Customers, "CustomerId", "CompanyName"), "- Please Select -", new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.CustomerName, null, new { @class = "text-danger" })
        </div>
    </div>
于 2017-09-03T17:35:36.080 に答える