创建另一个唯一但无意义的标识符,如(auto increment 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 对象,因为它的设计存在缺陷。大多数情况下的主键(我认为这是其中之一)应该是一个简单的自动递增整数,除了它作为表键的作用之外毫无意义。
虽然 Luke 建议使用 Session 是一个可行的选择和可行的解决方案,但我个人会做一些类似于我将在这里解释的事情,因为在我看来它更像是做事的“mvc 方式”。
数据模型:
要么将您当前的模型更改为我上面建议的模型,要么,如果由于某种原因(破坏依赖关系或 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
}
和 post 方法
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
}
我认为这已经差不多了。希望这是有道理的。