1

.Net MVC は比較的新しい。非常に単純な問題のように見えることに困惑しています。

互いに関連するオブジェクトがいくつかあります。

(例として)

public class Asset{
  public int Id{get;set;}
  public AssetCategory AssetCategory {get;set;}
  public string Value {get;set;}
}

public class AssetCategory{
  public string Name{get;set;}
  public DateTime SomeDate{get;set;}
  public int Id{get;set;}
}

View と pre に新しい「Asset」オブジェクトを作成したいので、AssetCategory セットで空のオブジェクトを作成します。次に、そのビューのモデルとして渡します。

@Html.HiddenFor(m=>m.AssetCategory) そのオブジェクトから文字列に変換して元に戻す方法がないため、 Which は明らかに失敗します。

持っている@Html.HiddenFor(m=>m.AssetCategory.Id)場合、ModelState は有効ですが、AssetCategory に関連付けられたすべての情報が含まれているわけではありません。

この状況では、切り離されたオブジェクトの正しいバージョンを DB から取得する必要がありますか? 現状では、新しいアセットを保存しようとすると. AssetCategory オブジェクトの null 非許容 DateTime が無効であるため、エラーが発生します。

4

3 に答える 3

1

サーバー上のカテゴリ情報のみが必要な場合は、はい、サーバー上でそれを取得し、保存する前にオブジェクトに添付します。

クライアントが AssetCategory を変更する場合にのみ、モデルに AssetCategory を含める必要があります。ユーザーが選択できるドロップダウンがあります。その場合は、id のみと有効なアイテムのリストをモデルに追加します。モデルがポストバックされたら、保存する必要があるオブジェクトに変換します。

つまり、データベースに保存する必要があるクラスを保持しますが、別のビュー モデルを作成します。

于 2013-04-30T19:57:33.667 に答える
0

必要なのが Id だけの場合、元のオプションは機能します (ただし、投稿されたデータのみに基づいて他の詳細は知られていないと述べました)。

@Html.HiddenFor(m=>m.AssetCategory.Id)

それ以上の情報が必要な場合は、EditorTemplate を使用してモジュール化してみてください。

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

\Views\Assets\EditorTemplates\AssetCategory.cshtml

@model AssetCategory
@Html.HiddenFor(m=>m.Id)
@Html.DisplayFor(m=>m.Name)

そうは言っても、この種のことにはEntityModelではなくViewModelを使用する必要があります。私がお勧めするのは、ID のみを返すようにしておくことですが、ポストバックでは、アセット自体を保存する前に、AssetCategoryId を使用してデータベースから完全なアセット カテゴリ情報をロードします。

于 2013-04-30T20:51:31.540 に答える