0

ASP.NET MVC3 モデル バインディングについて質問があります。モデルとして使用しようとしているクラスがあるが、ページにキーを配置したくない場合、モデルは POST にバインドされません。次に例を示します。

//Data Model
public class MyModel
{
    [Key]
    public string MyKey {get;set;} //Perhaps this is an ssn that I don't want on the form.
    public string MyValueToGet {get;set;} //This is the value I want the user to enter.
}

//Conroller code.
public ViewResult Index()
{
    MyModel model = new MyModel{ MyKey = "SecretInfo", MyValueToGet = "" };
    return View(new model);
}
public ActionResult Edit(MyModel model)
{
    repository.SaveChanges(model)
}

//View code.
@using(Html.BeginForm("Edit", "Home", FormMethod.Post))
{
    Enter a value: @Html.EditorFor(m => m.MyValueToGet)
    <input type="submit" value="Salve" />
}

だから私の問題は、フォームの送信時に Edit メソッドが呼び出されると、モデルが null になることです。MyKey をページのどこかに (おそらく非表示のフィールドとして) 配置することでこれを修正できますが、それがある種の機密データである場合は受け入れられません。この問題を解決する方法はありますか? 私はMVCが初めてなので、助けていただければ幸いです。

4

2 に答える 2

0

別の方法は、ID をクライアントに送信する前に暗号化することです。これを達成する方法の詳細については、この投稿を確認してください。 Asp MVC 3: ビューに送信される変更値

于 2012-08-03T18:11:34.850 に答える
0

(自動インクリメント 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
}

私はそれをレイアウトできるのと同じくらいだと思います。それが理にかなっていることを願っています。

于 2012-08-03T18:34:05.383 に答える