34

この単純なコントローラーについて考えてみます。

Porduct product = new Product(){
  // Creating a product object;
};
try
{
   productManager.SaveProduct(product);
   return RedirectToAction("List");
}
catch (Exception ex)
{
   ViewBag.ErrorMessage = ex.Message;
   return View("Create", product);
}

さて、私のCreate見解では、ViewBagオブジェクトをチェックして、Errorプロパティがあるかどうかを確認したいと思います。エラープロパティがある場合は、ユーザーにエラーメッセージを表示するために、ページにJavaScriptを挿入する必要があります。

これを確認するための拡張メソッドを作成しました。

public static bool Has (this object obj, string propertyName) 
{
    Type type = obj.GetType();
    return type.GetProperty(propertyName) != null;
}

次に、Createビューで、次のコード行を記述しました。

@if (ViewBag.Has("Error"))
{
    // Injecting JavaScript here
}

ただし、次のエラーが発生します。

null参照でランタイムバインディングを実行できません

何か案が?

4

6 に答える 6

99
@if (ViewBag.Error!=null)
{
    // Injecting JavaScript here
}
于 2012-06-22T08:09:36.557 に答える
22

ViewBagは「実際の」タイプではなく 動的オブジェクトであるため、コードは機能しません。

次のコードが機能するはずです。

public static bool Has (this object obj, string propertyName) 
{
    var dynamic = obj as DynamicObject;
    if(dynamic == null) return false;
    return dynamic.GetDynamicMemberNames().Contains(propertyName);
}
于 2012-09-10T16:16:56.700 に答える
4

ViewBagを使用する代わりに、ViewDataを使用して、保存しているアイテムのを確認できるようにします。ViewDataオブジェクトは、キーで参照できるオブジェクトのディクショナリとして使用されます。ViewBagのように動的ではありません。

// Set the [ViewData][1] in the controller
ViewData["hideSearchForm"] = true;    

// Use the condition in the view
if(Convert.ToBoolean(ViewData["hideSearchForm"])
    hideSearchForm();
于 2012-06-05T19:58:49.253 に答える
3

ここではViewBagを完全に避けます。これについての私の考えをここで参照してください:http: //completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

別の方法は、カスタムエラーをスローしてキャッチすることです。データベースがダウンしているかどうか、またはそのビジネスロジックがエラーを保存しているかどうかをどのように知ることができますか?上記の例では、単一の例外をキャッチするだけです。通常、各例外タイプをキャッチするためのより良い方法があり、次に、組み込みのカスタムエラーページやELMAHの使用など、真に未処理の例外の一般的な例外ハンドラーがあります。

したがって、上記では、代わりにModelState.AddModelError()を使用します。次に 、ビュー(aspxページ)内からModelStateにアクセスするにはどうすればよいですか?

したがって、「any」例外をキャッチした場合は、メッセージの表示を慎重に検討してください。

于 2011-12-27T04:02:10.330 に答える
3

を使用できますViewData.ContainsKey("yourkey")

コントローラー内:

ViewBag.IsExist = true;

ビューで:

if(ViewData.ContainsKey("IsExist")) {...}
于 2015-04-29T16:13:31.893 に答える
0

私はこれをテストする必要がありますが:

@if (ViewBag.ABoolParam ?? false)
{
    //do stuff
}

ViewBagプロパティの値を提供するか、欠落している場合はデフォルト値を返すと思います。

于 2021-07-15T18:13:00.263 に答える