问题很简单:
假设您有一个名为Person的模型
public class Person
{
public int PersonID {get; set;}
public string Name {get; set;}
[AllowHtml] // Allow html in Intro property
public string Intro {get; set;}
[ScaffoldColumn(false)]
public string ComplicatedValue {get; set;}
}
在控制器的“创建操作”
中[HttpPost]
public ActionResult Create(Person o, FormCollection collection)
{
// whatever code here;
}
如果你运行它,
我找到了这个问题的原因。
如果将功能更改为
public ActionResult Create(Person o) // Get rid of the *FormCollection collection*
{
// whatever code here;
}
这将消除“潜在的危险”错误。
但我的问题是我的应用程序,我必须在Create Action方法中使用辅助参数 FormCollection集合,因为我需要使用其他一些控件值和server变量将计算值分配给 ComplicatedValue 属性。
如果ASP.NET MVC3的任何专家遇到了和我一样的问题,并找到了解决方案,请告诉我。
答案 0 :(得分:7)
此链接中的此论坛详细讨论了此问题并提供了一些解决方法。
http://forums.asp.net/p/1621677/4161637.aspx
以下是该主题的一个解决方案,可能适用于您,也可能不适用于您:
public ActionResult Create(Person o) // Get rid of the *FormCollection collection*
{
FormCollection form = new FormCollection(Request.Unvalidated().Form);
// whatever code here;
}
或我自己的建议:
public ActionResult Create(Person o, int otherControlValue1, int otherControlValue2, ...)
{
o.ComplicatedValue = CalculateComplicatedValue(otherControlValue1, otherControlValue2, ...);
// whatever code here.
}
在我的情况下,我没有使用FormCollection,但它就在那里,所以我在[HttpPost]方法上有不同的足迹。我做了这个黑客并输入了一个伪造的参数:
public virtual ActionResult Edit(int id)
{
return View(this.repository.GetById(id));
}
[HttpPost]
public virtual ActionResult Edit(int id, int? bogusID)
{
var d = repository.GetById(id);
if (TryUpdateModel(d))
{
repository.Save();
return RedirectToAction("Index");
}
return View();
}
答案 1 :(得分:2)
我建议使用自定义模型绑定器而不是从FormCollection中提取复杂数据。 Scott Hanselman有一篇关于创建自定义模型绑定器的blog帖子,该绑定器可以作为一个很好的模板。在他的帖子中,他将DateTimeModelBinder放在一起,允许DateTime属性由包含日期的单个输入或包含日期和时间的一对输入设置。
答案 2 :(得分:0)
你试过吗
[装订(排除强> = “ComplicatedValue”)]
[HttpPost]
public ActionResult Create([Bind(Exclude="ComplicatedValue")]Person o)
{
}
?
它允许您在表单上排除 ComplicatedValue 属性,并仍然将对象作为 Person 类提交。
希望有所帮助