Как добавить список привязок в TryUpdateModel в asp.net mvc3 - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть следующий метод действия: -

[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 голосов
/ 15 февраля 2012

Я бы посоветовал вам избегать использования TryUpdateModel в целом.

В репозитории обычно есть метод обновления, который устанавливает модификацию entityState перед вызовом Save (), я не вижу этого в приведенном выше коде.

Если ваша цель состоит в том, чтобы отобразить запись и разрешить сохранение только даты, то создайте представление для этой модели и визуализируйте поля с:

. Устанавливает модель для представления:

@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 должны быть названы точно так же, как в модели, и использовать их для выборки и обновления сущности.

Вы должны проверить, что пользователь действительно может получить доступ и отредактировать это.d или в качестве альтернативы используйте Кодекс безопасности MVC , чтобы проверить, что параметр Id не был подделан.его действительно легко и удобно использовать, но это другое обсуждение.

В качестве альтернативы вы можете использовать такой атрибут, как описано в этом блоге , но я этим не пользуюсья:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create( [Bind(Include="Id,Date")] Assessment assessment)
0 голосов
/ 15 февраля 2012

Я попробовал это, он отлично работает

 string[] allowedProperties = new[] { "Date" }; 
            try 
            { 
                if (TryUpdateModel(a, allowedProperties))  
                { 
0 голосов
/ 15 февраля 2012

но я не могу написать что-то вроде

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

Это потому, что вы должны написать это так, поскольку аргумент разрешенных свойств представляет массив строк:

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

}
...