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 は null であってはなりません。モデル バインダーは、空の入力フィールド ( textbox ) を "" に設定するほどスマートです。モデルと使用しているテキストボックスの間でプロパティ名が一致していることを確認してください。

どのバージョンの MVC を使用していますか? 1つか2つ?VS 2008 で MVC 1 バージョンを実行していますが、FirstName を null にする唯一の方法は、フォームにまったく含めないことです。

最初の GET Edit ビューでこのエラーがスローされ、dbml とデータベースで FirstName が nullable に設定されているかどうかを確認できましたが、これは 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; }
}

クリーン フィックス ATM はありません。モデル バインダーは、実際にはこれらのプロパティを null に設定しています。コンストラクターで 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 を使用でき、トリミングされて戻ってきます。そこにコードを追加して、null や赤などではないことを確認し、適切な値を返すこともできます。

于 2009-12-03T03:17:43.030 に答える
-1

私はこれを行う拡張メソッドを認識していません。他の誰かがそうしている場合は、私に知らせてください。

null になる可能性のあるフィールド用の単純な HTML ヘルパーを作成します。

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

そして、コードで使用できます

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

将来の null 許容フィールドで再利用でき、簡単に読み取ることができます。

于 2009-12-03T03:39:23.307 に答える