0

我的强类型视图继承自使用 Linq to SQL 创建的“Person”对象。在我的“编辑”视图中,我当然必须显示旧值:

<%= Html.TextBox("FirstName") %>

“FirstName”是 NCHAR,因此需要修剪。所以我最终得到:

<%= Html.TextBox("FirstName", Model.FirstName.Trim()) %>

这有效。但是当提交表单时(在 POST 之后)并且出现一些错误,我需要再次显示它:

[AcceptVerbsAttribute(HttpVerbs.Post), Authorize(Roles = "office"), HandleError]
public ActionResult Edit(Models.Person person)
{
    if (!(_personService.ValidatePerson(person))) // Persona non valida
    { return View(person); }
}

如果由于某种原因用户将文本框“FirstName”留空,则结果属性 Person.FirstName 变为null并且 Model.FirstName.Trim() 引发异常(对象引用未设置为对象的实例)。

有什么方法可以修改绑定并默认修剪所有字符串?或者有什么想法可以解决这个问题

更新:似乎已确认是 MVC 2 行为.. 仍在寻找处理此问题的好方法。实际上使用扩展方法:

public static string TrimOrDefault(this string value)
{
    return value != null ? value.Trim() : string.Empty;
}
4

4 回答 4

1

这里有些奇怪。

Model.FirstName 不应为空;模型绑定器足够聪明,可以将空输入字段(文本框)设置为“”。确保您的模型和您使用的文本框之间的属性名称匹配。

您使用的是哪个版本的 MVC?1 还是 2?我在 VS 2008 中运行 MVC 1 版本,我可以让 FirstName 为空的唯一方法是根本不将它包含在表单中。

我可以看到您最初的 GET Edit 视图是否引发了此错误,并且您在 dbml 和数据库中将 FirstName 设置为可为空,但由于它是 Post,所以现在对我来说没有意义。;)

更新:

我已经确认了这一点:

使用空表格:

  • VS 2008 - Mvc 1 - FirstName = ""
  • VS 2010 - Mvc 2 - FirstName = null

哦哦...那会破坏很多代码...

编码:

查看(两者相同):

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="FirstName">FirstName:</label>
            <%= Html.TextBox("FirstName", Model.FirstName) %>
            <%= Html.ValidationMessage("FirstName", "*") %>
        </p>
        <p>
            <label for="LastName">LastName:</label>
            <%= Html.TextBox("LastName", Model.LastName) %>
            <%= Html.ValidationMessage("LastName", "*") %>
        </p>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

<% } %>

VS 2010-MVC 2

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }

    public ActionResult AddPerson()
    {
        var person = new Person();

        return View(person);
    }

    [HttpPost]
    public ActionResult AddPerson(Person person)
    {
        return View(person);
    }
}

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

VS 2008 - Mvc 1

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }


    public ActionResult AddPerson()
    {
        var person = new Person();

        return View(person);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult AddPerson( Person person )
    {

        return View(person);
    }
}

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

没有干净的修复自动取款机。模型绑定器实际上将这些属性设置为空。在构造函数中将 First 和 Last 设置为 "",并从绑定中排除这些属性:[Bind(Exclude="FirstName, LastName")] 它们保持为 ""。

这是在某个地方记录的吗?

于 2009-12-03T03:45:44.640 回答
1

尝试自定义模型绑定器。

请参阅:ASP.NET MVC:数据输入后修剪字符串的最佳方法。我应该创建自定义模型绑定器吗?

于 2010-01-18T02:04:13.367 回答
0

在 Models.Person 中,默认值为 String.Empty ,它至少应该消除 null 错误。

如果你想让它自动化,那么你可以将它添加到你的 dbml 文件中。附加了一个designer.cs 文件,每个字段都有一个getter 和setter。如果您愿意,可以在其中添加代码。

您还可以根据您的表格创建一个部分类并在其中处理修剪。这意味着如果您对 dbml 文件进行了更改,那么您的更改不会丢失。

如果您不使用 dbml 文件,请告诉我们。

编辑

如果您的 dbml 文件中有一个名为 person 的类,那么它已经被声明为部分的。

在同一个项目中创建另一个类并执行以下操作;

public partial class Person
{
    public string NewName
    {
        get { return this._name.Trim(); }
    }
}

因此,从那时起,您可以使用 .NewName 代替 name 并且它会回来修剪。您还可以在其中添加代码以确保它不是 null、不是红色、不是任何值并返回适当的值。

于 2009-12-03T03:17:43.030 回答
-1

我不知道这样做的扩展方法,如果其他人这样做,请告诉我。

我为可能为空的字段创建了一个简单的 HTML 帮助程序。

public static string TrimOrDefault(string value)
{
    return (value == null ? "" : value.Trim());
}

然后在你的代码中你可以使用

<%= Html.TextBox("FirstName", Helpers.TrimOrDefault(Model.FirstName)) %>

它可重复用于未来的可空字段并且易于读取。

于 2009-12-03T03:39:23.307 回答