【问题标题】:Some Fields Not Coming Through In ModelBinder在 ModelBinder 中没有出现的一些字段
【发布时间】:2010-12-11 23:43:12
【问题描述】:

以下是我的控制器的代码:

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

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

调用的视图具有对 Actor 类进行强类型化的局部视图。出于某种原因,有一些字段未绑定到该类。有问题的字段是地址、地址 2 和邮政编码。它们填充在页面上,但它们返回为空。其他所有字段都在那里,只是没有这些。

有什么想法吗?另外,我如何编写单元测试来复制这种行为?

更新 公共类演员 { 公共字符串 MiddleName{ 获取;设置;}

    [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>

【问题讨论】:

  • 你能列出你的视图和 Actor 对象定义吗?
  • 是的,Actor 是一个 POCO 类,视图中没有任何奇异的东西(我知道,无论如何)。

标签: asp.net-mvc modelbinders


【解决方案1】:

在 ASP.MVC 的 DefaultModelBinder 类中有一个名为 ConvertEmptyStringsToNull(默认 = true)的 ModelMetaData 属性将空字符串转换为 NULL。

您可以通过对每个属性的 DataAnnotation 进行更改,如下所示:

[DisplayFormat(ConvertEmptyStringToNull=false)]

或者您可以创建自己的 ModelBinder 并从 DefaultModelBinder 继承,然后重写 GetPropertyValue 方法以忽略此设置,如下所示:

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

【讨论】:

    【解决方案2】:

    测试模型绑定器的方法如下:

    How to test custom Model Binders in ASP.NET MVC?

    只有你会测试 DefaultModelBinder。

    至于字段,您还没有显示 Actor 源代码。但是由于您谈论字段,我猜您确实使用了字段-但 ASP.NET MVC 模型绑定器不会绑定到字段-仅绑定到属性。所以如果你有

    public class Actor
    {
       public string ZipCode;
    }
    

    你需要改成

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

    另一个原因可能是你有

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

    你使用 partial 来显示地址;所以它被命名为“ZipCode”,但它必须被命名为“Address.ZipCode”。或者,您的 Address 可能没有无参数构造函数......换句话说,如果没有看到源代码,那么猜测太多了。

    有了更新信息,这是无意义的。坏的领域看起来和好的领域一样。但是尝试 Html.TextBox 而不是 EditorFor。尝试使用 FireBug(或 IE Dev)查看 POST 数据,检查字段名称和值是否正确。如果他们这样做 - 问题出在模型活页夹上,如果它们不好/不存在 - 页面有问题。此外,请尝试检查控制器操作中的 ModelState.IsValid 以及 ModelState 错误。

    【讨论】:

    • 我正在使用自动属性,这只是实现方面字段的语法糖。待会儿再说,我写这篇文章的时候已经很晚了,我没有脑子继续发代码。
    • 这些字段原本是 Html.TextBox,我将它们切换到 EditorFor 看看它是否有所作为。它没有,而且由于它们使用这两种方法在页面上呈现相同,我几乎排除了这是一个原因。作为检查,我为 Add 方法创建了一个新的强类型视图,并且在相同的字段中遇到了相同的错误。是时候深入挖掘了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多