如何将绑定列表添加到asp.net mvc3中的TryUpdateModel

时间:2012-02-14 22:57:06

标签: asp.net-mvc-3 model-binding

我有以下行动方法: -

[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

3 个答案:

答案 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))  
                {