我有以下行动方法: -
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
Assessment a = elearningrepository.GetAssessment(id);
try
{
if (TryUpdateModel(a))
{
elearningrepository.Save();
return RedirectToAction("Details", new { id = a.AssessmentID });
}
}
//code does here
但我不能写if (TryUpdateModel(a, "Assessment", new string { "Date"}))
之类的内容来指定我只允许更新Date属性。
那么如何将绑定列表添加到上面的 if (TryUpdateModel(a))
?
BR
答案 0 :(得分:0)
但我不能写像
这样的东西
if (TryUpdateModel(a, "Assessment", new string { "Date"}))
那是因为你应该这样写,因为allowed属性参数代表一个字符串数组:
if (TryUpdateModel(a, "Assessment", new[] { "Date" }))
{
}
答案 1 :(得分:0)
我建议你不要使用TryUpdateModel。
存储库通常有一个更新方法,在调用Save()之前将entityState设置为已修改,我在上面的代码中看不到。
如果您的目标是显示记录并仅允许保存日期,则为该模型创建一个视图,并使用以下内容呈现字段:
这将设置视图的模型:
@model YourNamespace.Models.Assessment
@Html.DisplayFor(model=>model.propertyToDisplay)
关于您只想显示的项目,以及
@Html.EditorFor(model=>model.Date)
在动作控制器中,将要绑定的属性作为输入参数:
<强>被修改强>
class Assessment
{
public int Id { get; set; }
public DateTime Date { get; set; }
//Other properties
}
public ActionResult Edit(int Id, DateTime Date)
{
var assessment = elearningrepository.GetAssessment(id);
assessment.Date = Date;
elearningrepository.UpdateAssessment(assessment);
elearningrepository.Save();
//Redirect to action Detail
}
在这种情况下,模型绑定器应该只绑定到Id和Date,所以即使有人试图发布其他值(编辑html表单很容易),ActionResult中的参数应该与模型中的参数完全相同,并使用它获取和更新实体。
您应该验证用户是否可以实际访问和编辑该ID,或者作为替代方法使用MVC Security Codeplex来检查Id参数是否未被篡改。它使用起来非常简单方便,但这是另一种讨论。
作为替代方案,您可以使用this blog中描述的这样的属性,但我自己不使用它:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create( [Bind(Include="Id,Date")] Assessment assessment)
答案 2 :(得分:-1)
我试过这个它工作正常
string[] allowedProperties = new[] { "Date" };
try
{
if (TryUpdateModel(a, allowedProperties))
{