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 方法时模型为空。我可以通过将 MyKey 放在页面上的某个位置(可能作为隐藏字段)来解决此问题,但如果它是某种敏感数据,这是不可接受的。有没有办法解决这个问题?我是 MVC 的新手,所以我很感激任何帮助。

4

2 回答 2

0

另一种方法是在将 id 发送给客户端之前对其进行加密。查看这篇文章以获取有关如何完成此操作的更多信息。 Asp MVC 3:修改发送到视图的值

于 2012-08-03T18:11:34.850 回答
0

创建另一个唯一但无意义的标识符,如(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
}

我认为这已经差不多了。希望这是有道理的。

于 2012-08-03T18:34:05.383 回答