2013-03-30 2 views
0

Я объявляю модель с 4 строковыми полями. 3 из которых предназначены только для чтения на форме:Модели MVC не сохраняются в форме

public class HomeModel 
    { 
     [ReadOnly(true)] 
     [DisplayName("Service Version")] 
     public string ServiceVersion { get; set; } 

     [ReadOnly(true)] 
     [DisplayName("Session Id")] 
     public string SessionId { get; set; } 

     [ReadOnly(true)] 
     [DisplayName("Visiting from")] 
     public string Country { get; set; } 

     [DisplayName("Search")] 
     public string SearchString { get; set; } 

    } 

Я прохожу модель, после наполнения его, к моей форме:

[HttpGet] 
     public ActionResult Index() 
     { 
      var model = new HomeModel 
          { 
           Country = "Australia", 
           SearchString = "Enter a search", 
           ServiceVersion = "0.1", 
           SessionId = "76237623763726" 
          }; 
      return View(model); 

     } 

И отображается форма, как я ожидал:

<h2>Simple Lookup</h2> 

@Html.LabelFor(m=>m.ServiceVersion): @Model.ServiceVersion<br/> 
@Html.LabelFor(m=>m.SessionId): @Model.SessionId<br/> 
@Html.LabelFor(m=>m.Country): @Model.Country<br/> 
<p> 
    @using(Html.BeginForm()) 
    { 
     @Html.LabelFor(m => m.SearchString) 
     @Html.TextBoxFor(m => m.SearchString) 
     <button type="submit" name="btnSearch">Search</button> 
    } 
</p> 

Но, когда я отправляю форму и возвращаю модель из формы, заполняется только значение SearchString.

[HttpPost] 
public ActionResult Index(HomeModel model) 
{ 
    return View(model); 
} 

Правильно ли, что другие поля были «потеряны»? Сохраняет ли MVC других членов класса модели? И если это ожидается - есть ли способ их получить? Или мне нужно вернуться к моей базе данных, заполнить модель старыми значениями, а затем использовать новые значения из модели формы?

Возможно, что вопрос о том, что вы хотите прочитать поля «только для чтения» от модели, ставится под сомнение. Это справедливо, но в случае, если я нахожу что-то подозрительное в отношении опубликованных данных, возможно, показать экран и не перечитывать данные из базы данных еще раз?

+0

[ReadOnly (true)] означает, что свойство является readonly и, следовательно, не будет привязано к значениям, отправленным обратно –

ответ

0

Это правильное поведение. Только элементы внутри формы будут отправлены на ваше действие. Поскольку он отправляет форму, чтобы ваши поля находились внутри формы, чтобы получить их по методу post.

Update

Кроме того, вы не можете прочитать определенное поле на вашем методе действия, если вы взяли это поле только для чтения на ваш взгляд. например: отображение с использованием @Html.LabelFor. Чтобы вернуть поле в действие, используйте @Html.HiddenFor, если поле не редактируется.

+0

Я переместил другие поля в форму, но получаю ту же проблему. Может быть, они не должны быть только для чтения в модели? – Craig

+0

Да точно. Вы не можете вернуть поля только для чтения в свой почтовый метод. –

+0

ОК, спасибо. Итак, в случае, когда мне нужно увидеть поле как метку, и вернемся к модели, я должен использовать как HiddenFor (для публикации), так и DisplayFor (для отображения)? – Craig

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