Asp.net mvc 3 如何在asp.net mvc3中将绑定列表添加到TryUpdateModel

Asp.net mvc 3 如何在asp.net mvc3中将绑定列表添加到TryUpdateModel,asp.net-mvc-3,model-binding,Asp.net Mvc 3,Model Binding,我有以下行动方法:- [HttpPost] public ActionResult Edit(int id, FormCollection collection) { Assessment a = elearningrepository.GetAssessment(id); try { if (TryUpdateModel(a)) { elearnin

我有以下行动方法:-

[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”,newstring{“Date”}))的东西来指定我只允许更新Date属性。
那么,如果(TryUpdateModel(a))
,我如何将绑定列表添加到上面的

但是我不能写这样的东西

if(TryUpdateModel(a,“评估”,新字符串{“日期”}))

这是因为您应该这样编写,因为allowed properties参数表示字符串数组:

if (TryUpdateModel(a, "Assessment", new[] { "Date" }))
{

}

我建议您一般不要使用TryUpdateModel

存储库通常有一个update方法,在调用Save()之前将entityState设置为modified,我在上面的代码中看不到这一点

如果目标是显示记录并仅允许保存日期,则为该模型创建一个视图,并使用以下内容渲染字段:

这将设置视图的模型:

@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,或者作为检查id参数是否未被篡改的替代用途。它的使用非常简单方便,但这是另一个讨论

作为替代方案,您可以使用中所述的属性,但我自己不使用该属性:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create( [Bind(Include="Id,Date")] Assessment assessment)

我试过这个,效果很好

 string[] allowedProperties = new[] { "Date" }; 
            try 
            { 
                if (TryUpdateModel(a, allowedProperties))  
                { 

感谢您的回复,但使用您的代码将永远不会执行更新,即使我尝试更新日期字段,也不会保存,并且旧值仍将存在。请记住,编辑视图中的其他字段已禁用,因此它们不应成为模型绑定的一部分。谢谢您的回复,但作为MVC web应用程序安全性的一部分,我应该避免过度发布线程;这就是为什么我需要使用[bind]指定一个白名单。我需要在我的应用程序中使用这种方法,而不仅仅是针对这个特定的情况。任何建议……我对这篇文章做了不少编辑。在建议的解决方案中,仅绑定视图中所需的属性。如果你真的不想发布任何东西,只想发布你需要的值,你只需要使用Html.BeginForm(创建表单标签)将你想发布的内容放在@using@Html.BeginForm中-在这种情况下,只需要日期和Id,或者你需要使用jQuery.post或Javascript发布到action方法。谢谢你的编辑,但是这个方法对我来说伸缩性不好,因为在其他senarios中,我可能需要白名单来包含不仅仅是一个日期字段。溴