(自動インクリメント int) のような別の一意ではあるが意味のない識別子を作成し、それを使用してバインドします。
つまり、モデルを次のように変更します。
public class MyModel
{
[Key]
public int ID {get; set;}
public string MyKey {get;set;} //Now this can be sensitive, it doesn't matter because you no longer rely on it.
public string MyValueToGet {get;set;} //This is the value I want the user to enter.
}
編集
設計に欠陥があるため、MyModel オブジェクトを変更するのが最善の選択だと思います。ほとんどの場合 (これはそのうちの 1 つだと思います) の主キーは単純な自動インクリメント整数である必要があり、テーブルのキーとしての役割を除けば意味がありません。
Session を使用するという Luke の提案は実行可能なオプションであり、機能する解決策ですが、個人的には、ここで説明することと同様のことを行います。
データ モデル:
現在のモデルを上で提案したようなものに変更するか、何らかの理由 (依存関係や FK 関係の破壊) でそれが実行できない場合は、結合またはプロキシとして使用できる新しいテーブルを作成します。あなたはするであろう:
public class Proxy
{
public int ProxyId {get;set;}
public MyModel MyModel {get; set;}
}
明らかに、このテーブルにデータを入力するために何らかの作業を行う必要がありますが、プロパティに直接MyModel
アクセスせずに、テーブルを使用してレコードをフェッチすることができます。MyKey
ビューでデータ モデルを直接使用することはお勧めできないため、ビュー モデルも作成する必要があります。
public class MyModelViewModel
{
public int ModelId {get; set;}
public string ModelValueToGet {get; set;}
}
ビュー モデルに機密データを含むキーさえ必要ないことに注意してください。
次に、ビューをデータ モデルではなく viewModel に入力し、ModelId の非表示フィールドを含めます。
@using(Html.BeginForm("Edit", "Home", FormMethod.Post))
{
Enter a value: @Html.EditorFor(m => m.ModelValueToGet)
@Html.HiddenFor(m => m.ModelId)
<input type="submit" value="Save" />
}
これで、コントローラーに get メソッドがあります
public ViewResult Index()
{
//fetch the users record from the database
//if you're using the Proxy table, you'll want to write a LINQ query here
//instantiate a viewModel and populate it's properties using the fetched record
//remember, the viewModel.ModelId should be set to MyModel.ID or Proxy.ProxyId
//render the view
}
そして投稿方法
public ViewResult Edit (MyModelViewModel viewModel)
{
//fetch the users record from the database using viewModel.ModelId
//If you're using the proxy table, you'll need to use that LINQ query again here
//update the record you fetched with the new data the user just entered
//you have complete control here of what gets updated and what stays the same
//pass the updated record to the repository to save the changes.
//redirect the user to be on their merry way
}
私はそれをレイアウトできるのと同じくらいだと思います。それが理にかなっていることを願っています。