-1

私は自分の問題に最も適した方法を理解しようとしています。モデルに値を追加してModelStateの入札を渡す

public class Customer 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    [Required] 
    public int StoreId { get; set;} 
    [Required] 
    public DateTime UpdatedAt {get; set;} 
} 

と私は、データベースに新しい顧客を挿入するために、次のような方法がありますAPIコントローラがあります:今、することができますように

public IHttpActionResult Insert(Customer customer) 
{ 
    customer.StoreId = 5; //just for example 
    customer.UpdatedAt = DateTime.Now; //again, just as example 

    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    db.Customers.Add(customer); 
    db.SaveChanges(); 

    return Ok(customer.Id); 
} 

をさんは、私はこのようなモデルを持っているとしましょうこのメソッドでは、StoreIdフィールドとUpdatedAtフィールドが、このメソッドに送信された元のhttpリクエストに含まれないと仮定します。これらの値は、サーバー側で計算して割り当てる必要があります(基本的にクライアントは想定されていませんこれらの値をサーバー側のメソッドに送信する)。この場合、2つの必須フィールドがないため、ModelStateはもう有効ではありません。あなたはそれを回避することができます

一つの方法は、実行して、1でモデル状態1のエラーをクリアすることです:検証をやって、その後

ModelState["Store.Id"].Errors.Clear(); 
ModelState["UpdatedBy"].Errors.Clear(); 

をして、それは良い方法を見ていません特に、サーバー側で処理する必要があるフィールドが多い場合は、

もっと良い解決策はありますか?

+1

モデルは有効です。 'StoreId'と' UpdatedAt'の値を渡さないと、デフォルト値( '0'と' 1/1/0001')として初期化されます。無効にする唯一の方法は、あなたが特に 'null'値を送る場合です。これらのプロパティを含まないビューモデルを使用する必要があります。特定のエラーメッセージを指定したい場合を除いて '[Required]'属性を追加する必要はありません。 'int'と' DateTime'はヌル入力可能ではなく、常に必要です。 –

+0

あなたは必要な値または参照値を'view'をコントローラに送る前に、モデルが常に有効になります。 nullを送信した場合のみ、無効になります – TheUknown

答えて

1

良い方法はありますか?ビューに固有のビューモデルを作成し、ビューが提供するはずのプロパティのみを持ちます。あなたのGETアクションで

public class CustomerVm 
{ 
    public int Id { get; set; } 
    public string Name { get; set; }  
} 

、今すぐあなたのビューが強く、この

@model CustomerVm 
@using(Html.BeginForm()) 
{ 
    @Html.HiddenFor(s=>s.Id) 
    @Html.TextBoxFor(s=>s.Name) 
    <input type="submit" /> 
} 

とあなたのHttpPostアクション、使用中にタイプされるビューに

public ActionResult Edit(int id) //Or even Create 
{ 
    var vm=new CustomerVm { Id=id, Name="Scott to be edited"}; 
    return View(vm); 
} 

をこのオブジェクトを送信メソッドパラメータと同じビューモデル、プロパティ値を読み込んで使用する

[HttpPost] 
public ActionResult Create(CustomerVm model) 
{ 
    var customerEntity = new Customer { Name= model.Name }; 
    //Stuff server should set goes now 
    customerEntity.StoreId = 23; 
    customerEntity.UpdatedAt = DateTime.Now; 

    db.Customers.Add(customerEntity); 
    db.SaveChanges(); 
    return Ok(customerEntity.Id); 
} 
関連する問題