2

nullモデルが渡された場合でも機能するように、カスタムエディターテンプレートを設計したいと思います。つまり、がnullの@Html.EditorForModel()場合。Model

私が抱えている問題は、EditorTemplateを使用しているときに、モデルのプロパティの1つにアクセスする必要がある場合があり、かなり古い記述になることです。@if(Model != null && Model.[Property] ...)

例えば

@model MyObject
@if(Model.BoolProperty) // throws NullReferenceException
{
    <div>...additional stuff here</div>
}

@Html.EditorFor(m => m.OtherProperty)

次のような拡張メソッドを追加することを検討しました

public static R GetValue<T, R>(this WebViewPage<T> viewPage, Func<T, R> selector)
{
    if (selector == null) throw new ArgumentNullException("selector");
    if (viewPage == null) throw new ArgumentNullException("viewPage");
    if (viewPage.Model == null) return default(R);
    return selector(viewPage.Model);
}

このようにEditorTemplateでそれを使用します

@model MyObject
@if(this.GetValue(m => m.BoolProperty)) // Safely gets value or false
{
    <div>...additional stuff here</div>
}

@Html.EditorFor(m => m.OtherProperty)

しかし、モデルが存在する場合に、をスローせずにこれらのプロパティにアクセスしようとする組み込みの方法または「適切な」方法があるかどうかを知りたいですNullReferenceException

4

2 に答える 2

2

一度チェックしてみませんか:

@model MyObject
@if (Model == null)
{
    <div>Sorry, nothing to edit here<div>
}
else
{
    ... here you can access the model properties
}

または、テンプレートを呼び出すときに外部でさえ:

@if (Model != null)
{
    @Html.EditorForModel()
}

このようにして、テンプレート内でモデルがnullかどうかを確認する必要がなくなります。

于 2012-04-19T06:13:47.920 に答える
0

秘訣は、エディターテンプレートの着信モデルをnull許容型にすることです。整数の場合、DateTime?日付については、ブール?ブール値などの場合...

では、Integer.cshtmlの先頭にintがありますか?intの代わりに

@model int?
... your code here ...

Currency.cshtmlというお金のエディターテンプレートを作成したとすると、上部に次のタイプが表示されます。

@model decimal?
... your code here...

参考までに、.NETのnull許容型には、GetValueOrDefaultとHasValueの2つの便利なメソッドがあります。

于 2012-04-18T21:17:03.507 に答える