2013-09-12 2 views
1

У меня есть сценарий, когда мне нужно обновить объект из информации, которая была отправлена ​​в действие. Пока информация находится на странице, это работает отлично. Тем не менее, это требует, чтобы я помещал информацию в скрытые поля, если я не хочу, чтобы модельное состояние жаловалось.Использовать TryUpdateModel для привязки частично поставленных значений

В качестве примера, предположим, что я использую ниже класс как модель:

public class Client 
{ 
    [Required] 
    public string Name { get; set; } 

    public string Email { get; set; } 

    public int Id { get; set; } 
} 

Если я не хочу, чтобы пользователь изменить имя, мне нужно, чтобы включить его в скрытое поле что он привязан к модели и проходит проверку.

Проблема, которая возникает у меня, это, очевидно, небезопасно, если она используется с более конфиденциальной информацией. Так что я попытался это:

public virtual ActionResult Save(Client model, int clientId) 
    { 
     var client = datasource.LoadEntity(adapter, clientId); // clientId is passed as a querystring to the action 

     if (!TryUpdateModel(client)) 
      return new RedirectResult('The edit page URL'); 
    } 

Проблема заключается в том, что до сих пор ModelState жалуется на значение «Имя» не доступны, даже если он был загружен на объект клиента из базы данных.

Очевидно, что я делаю что-то неправильно, но я не могу понять, что.

+0

Если вы обеспокоены безопасностью, вы действительно должны использовать SSL для защиты связи между клиентом и сервером. Причина жалобы на структуру заключается в том, что валидация происходит непосредственно перед действием, выполняемым во время привязки к модели, то, что вы пытаетесь сделать, слишком поздно. –

+0

@ChrisHardie Я действительно использую решение, которое можно найти здесь: http://stackoverflow.com/questions/9604049/asp-net-mvc-3-validation-exclude-some-field-validation-in-tryupdatemodel?rq=1 который делает именно то, что я хочу. –

ответ

0

Модель просмотра предназначена только для информации, поступающей от клиента.

Значит, вы должны удалить Name и получить его из другого места.

Если это вид модели также используется администратором, например, (который в состоянии ввести/изменить название), то лучше всего будет получена модель представления, как это:

public class Client 
{ 
    public string Email { get; set; } 
    public int Id { get; set; } 
} 

public class ClientWithName : Client 
{ 
    [Required] 
    public string Name { get; set; } 
} 
0

Вы можете использовать overloadTryUpdateModel(TModel, string\[\]); если я правильно понимаю, это должно позволить задать свойство включать в обновлении, как это:

public virtual ActionResult Save(Client model, int clientId) 
{ 
    var client = datasource.LoadEntity(adapter, clientId); 

    if (!TryUpdateModel(client, new string[] { "Email" })) 
     return new RedirectResult('The edit page URL'); 
} 

Я никогда не пробовал, хотя, вы можете, дайте нам знать, если он работает, как ожидалось?

+0

Это не похоже на то, что модельное состояние все еще недействительно, поскольку оно, кажется, установлено перед входом в действие. –

0

Я пошел с решением, описанным здесь: Asp.net MVC 3 Validation exclude some field validation in TryUpdateModel

По существу, он удаляет проверку из ModelState, если эти поля не присутствует, которая работает для меня, как эти значений извлекаются из базы данных.

Смежные вопросы