1

チェックアウトコントローラーにはコードがあります

    [HttpPost]
    public ActionResult AddressAndPayment(FormCollection values)
    {
        var order = new Order();
        TryValidateModel(order);
     ....

モデルはこんな感じ

[Bind(Exclude="OrderId")]
public partial class Order
{
    [ScaffoldColumn(false)]
    public int OrderId { get; set; }

    [ScaffoldColumn(false)]
    public string Username { get; set; }

    [Required(ErrorMessage= "First Name is required")]
    [DisplayName("First Name")]
    [StringLength(160)]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Last Name is required")]
    [DisplayName("Last Name")]
    [StringLength(160)]
    public string LastName { get; set; }

    [Required(ErrorMessage="Address is required")]
    [StringLength(70)]
    public string Address { get; set; }

    [Required(ErrorMessage = "City is required")]
    [StringLength(40)]
    public string City { get; set; }

    [Required(ErrorMessage = "State is required")]
    [StringLength(40)]
    public string State { get; set; }

    [Required(ErrorMessage = "Postal Code is required")]
    [DisplayName("Postal Code")]
    [StringLength(10)]
    public string PostalCode { get; set; }

    [Required(ErrorMessage="Country is required")]
    [StringLength(40)]
    public string Country { get; set; }

    [Required(ErrorMessage= "Phone is required")]
    [StringLength(24)]
    public string Phone { get; set; }

    [Required(ErrorMessage="Email Address is required")]
    [DisplayName("Email Address")]
    [RegularExpression(@"[A-za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage="Email is not valid.")]
    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [ScaffoldColumn(false)]
    public decimal Total { get; set; }

    [ScaffoldColumn(false)]
    public DateTime OrderDate { get; set; }
    public List<OrderDetail> OrderDetails { get; set; }
}

TryValidateModel 行の直前で停止して、次のようなフォーム値を確認できます。

? Request.Form["FirstName"]
 "Michael"
 ? values["FirstName"]
   "Michael"

では、なぜ TryValidateModel(order); false を返すと、注文オブジェクトが取り込まれませんか?

更新 私の質問を明確にするために、false はバインドできないことを知っていますが、バインドできない理由はわかりません。または、TryValidateModel (または ValidateModel さえも) を使用する必要があります。

しかし興味深いのは、メソッド シグネチャを次のように変更すると、

 public ActionResult AddressAndPayment(Order order)

注文が正しく入力されます。したがって、メソッド呼び出しでバインドできる場合、なぜ TryValidateModel (または ValidateModel でさえも) を使用しないのでしょうか?

私はMVC 4を使用しています

4

1 に答える 1

1

TryValidateModelに対するfalse検証が失敗すると、を返します。したがって、バインディングは失敗します。Form ModelOrders Model

私は使用するのが嫌い

TryValidateModel(order);

そして好む

    ValidateModel(order);

バインディングはデリケートなプロセスであるため、ページの開発の早い段階で。このように、モデルがバインドに失敗した場合、例外と表示エラーメッセージが表示されます。

于 2013-02-17T20:33:30.227 に答える