0

以下は私のコントローラーのコードです。

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, Actor actor)
    {

        try
        {
            actorRepository.Save(actor);
            return RedirectToAction("Index");
        }
        catch
        {
            return View("Edit");
        }
    }

呼び出すビューには、Actorクラスに強く型付けされた部分ビューがあります。何らかの理由で、クラスにバインドされていないフィールドがいくつかあります。問題のフィールドは、Address、Address2、およびZipCodeです。それらはページに入力されますが、nullに戻ります。これらだけでなく、他のすべてのフィールドがあります。

何か案は?また、この動作を再現する単体テストを作成するにはどうすればよいですか?

public class Actor {public string MiddleName {get ; セットする;}

    [Required(ErrorMessage = "First Name is Required")]
    [RegularExpression(@"\w*", ErrorMessage = "Last Name Contains Illegal Characters")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Last Name is Required")]
    [RegularExpression(@"\w*", ErrorMessage = "Last Name Contains Illegal Characters")]
    public string LastName { get; set; }

    [DataType(DataType.PhoneNumber, ErrorMessage = "Please Enter a Valid Phone Number")]
    [Required(ErrorMessage = "Phone Number is Required")]
    public string PhoneNumber { get; set; }

    [Required(ErrorMessage = "Address is Required")]
    [RegularExpression(@"\w*", ErrorMessage = "Address Contains Illegal Characters")]
    public string Address { get; set; }

    [RegularExpression(@"\w*", ErrorMessage = "Address2 Contains Illegal Characters")]
    public string Address2 { get; set; }

    [RegularExpression(@"\w*",ErrorMessage = "State Contains Illegal Characters")]
    [Required(ErrorMessage = "State is Required")]
    public string State { get; set; }

    [Required(ErrorMessage = "Zip Code is Required")]
    [RegularExpression("\b[0-9]{5}(?:-[0-9]{4})?\b",ErrorMessage = "Please Enter a Valid Zip Code")]
    public string ZipCode { get; set; }

    [Required(ErrorMessage = "Even in theater, you have to choose a gender")]
    public bool? Gender { get; set; }

    [Required(ErrorMessage = "Cell Phone Number is Required")]
    public string CellPhone { get; set; }

    public int ActorId { get; set; }

    [DataType(DataType.MultilineText, ErrorMessage = "Illegal Characters in Notes")]
    public string Notes { get; set; }

    [Required(ErrorMessage = "Email Address is Required")]
    [DataType(DataType.EmailAddress)]
    public string EMail { get; set; }

    [Required(ErrorMessage = "City Is Required")]
    public string City {get; set;}
}

<fieldset>
<legend>Fields</legend>
<p>
    <label for="MiddleName">MiddleName:</label>
    <%= Html.EditorFor(m=>m.MiddleName) %>
    <%= Html.ValidationMessage("MiddleName", "*") %>
</p>
<p>
    <label for="FirstName">FirstName:</label>
    <%=Html.EditorFor(m=>m.FirstName) %>
    <%= Html.ValidationMessage("FirstName", "*") %>
</p>
<p>
    <label for="LastName">LastName:</label>
    <%= Html.TextBox("LastName", Model.LastName) %>
    <%= Html.ValidationMessage("LastName", "*") %>
</p>
<p>
    <label for="PhoneNumber">PhoneNumber:</label>
    <%= Html.TextBox("PhoneNumber", Model.PhoneNumber) %>
    <%= Html.ValidationMessage("PhoneNumber", "*") %>
</p>
<p>
    <label for="Address">Address:</label>
       <%=Html.EditorFor(m=>m.Address) %>
       <%= Html.ValidationMessage("Address", "*") %>
</p>
<p>
    <label for="Address2">Address2:</label>
       <%=Html.EditorFor(m=>m.Address2) %>
    <%= Html.ValidationMessage("Address2", "*") %>
</p>
<p>
    <label for="State">State:</label>
    <%= Html.TextBox("State", Model.State) %>
    <%= Html.ValidationMessage("State", "*") %>
</p>
<p>
    <label for="ZipCode">ZipCode:</label>
    <%= Html.TextBox("ZipCode", Model.ZipCode) %>
    <%= Html.ValidationMessage("ZipCode", "*") %>
</p>
<p>
    <label for="Gender">Gender:</label>
    <%= Html.TextBox("Gender", Model.Gender) %>
    <%= Html.ValidationMessage("Gender", "*") %>
</p>
<p>
    <label for="CellPhone">CellPhone:</label>
    <%= Html.TextBox("CellPhone", Model.CellPhone) %>
    <%= Html.ValidationMessage("CellPhone", "*") %>
</p>
<p>
    <label for="ActorId">ActorId:</label>
    <%= Html.TextBox("ActorId", Model.ActorId) %>
    <%= Html.ValidationMessage("ActorId", "*") %>
</p>
<p>
    <label for="Notes">Notes:</label>
    <%= Html.TextBox("Notes", Model.Notes) %>
    <%= Html.ValidationMessage("Notes", "*") %>
</p>
<p>
    <label for="EMail">EMail:</label>
    <%= Html.TextBox("EMail", Model.EMail) %>
    <%= Html.ValidationMessage("EMail", "*") %>
</p>
<p>
    <label for="City">City:</label>
    <%= Html.TextBox("City", Model.City) %>
    <%= Html.ValidationMessage("City", "*") %>
</p>
<p>
    <input type="submit" value="Save" />
</p>
</fieldset>
4

2 に答える 2

2

ASP.MVC の DefaultModelBinder クラスには、空の文字列を NULL に変換するConvertEmptyStringsToNull (デフォルト = true) というModelMetaData プロパティがあります。

次のように、各プロパティの DataAnnotation を介してこれを変更できます。

[DisplayFormat(ConvertEmptyStringToNull=false)]

または、独自の ModelBinder を作成して DefaultModelBinder から継承し、次のように GetPropertyValue メソッドをオーバーライドしてこの設定を無視することもできます。

ModelBinders.Binders.DefaultBinder = 新しい Delphi.Mvc.KeepStringsBinder(); ModelBinders.Binders.Add(typeof(ObjectBase), new Delphi.Mvc.KeepStringsBinder());

于 2010-01-30T23:47:42.493 に答える
0

モデルバインダーをテストする方法は次のとおりです。

ASP.NET MVCでカスタムモデルバインダーをテストする方法は?

DefaultModelBinderをテストするのはあなただけです。

フィールドに関しては、Actorのソースコードを表示していません。ただし、フィールドについて話しているので、実際にはフィールドを使用していると思いますが、ASP.NETMVCモデルバインダーはフィールドにバインドせず、プロパティにのみバインドします。だからあなたが持っているなら

public class Actor
{
   public string ZipCode;
}

次のように変更する必要があります

public class Actor
{
   public string ZipCode { get; set; }
}

別の理由はあなたが持っているということかもしれません

public class Actor
{
   public Address Address { get; set; }
}

部分的にアドレスを表示します。したがって、「ZipCode」という名前ですが、「Address.ZipCode」という名前にする必要があります。または、Addressにパラメーターなしのコンストラクターがない可能性があります...言い換えると、ソースコードが表示されない場合は、推測することが多すぎます。

更新情報では、これは意味がありません。悪いフィールドは良いフィールドと同じように見えます。ただし、EditorForの代わりにHtml.TextBoxを試してください。FireBug(またはIE Dev)を使用してPOSTデータを調べ、フィールドの名前と値が正しく入力されていることを確認してください。もしそうなら-問題はモデルバインダーにあり、それらが悪い/存在しない場合-ページに何か問題があります。また、コントローラーアクションのModelState.IsValidと、ModelStateエラーを確認してください。

于 2009-11-01T10:12:50.950 に答える