2010-10-26 2 views
1

У меня есть сайт, работающий с ASP.NET MVC 1, и столкнулся с ошибкой, когда bool в моей модели сбрасывается по умолчанию, потому что значение не используется в Посмотреть.Как остановить представление, возвращающее значение по умолчанию в ASP.NET MVC

Код для контроллера:

public ActionResult Edit(Guid id) 
{ 
    Service service = GetService(id); 

    if (service == null) 
     return View("NotFound"); 

    return View(service); 
} 

когда вид кода был:

<label for="IsActive"> Is Active: </label> 
<%= Html.TextBox("IsActive") %> 

он работал отлично, однако, как только он был удалили IsActive поле всегда было возвращено как ложное. Я больше не хочу, чтобы IsActive увидеть или модифицирована с этой точки зрения, но удаление это вызвало значение, которое будет потеряно, я попытался установить значение и не отображая его с

<% Html.TextBox("IsActive"); %> 

но до сих пор это недобросовестный значение ложного

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Service service) 
{ 
    //UpdateLogic 
} 

в методе пост, независимо от того, что было IsActive раньше, Service.IsActive всегда ложно

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

ответ

3

Вы можете добавить его в качестве скрытого на странице:

<%= Html.Hidden("IsActive"); %> 
+1

спасибо, что идеально (ему нужны равные для работы, но отличные от этого свои большие) - <% = Html.Hidden ("IsActive")%> – Manatherin

+0

Это не лучший способ исправить это. это позволит очень легко изменить значение в браузере в любом случае, проверьте мое исправление. – Stefanvds

+1

@Stefanvds - Мне не нравится ваше исправление. Похоже, вы ставите много логики в контроллер, который не должен находиться в контроллере. Я предпочитаю подход ViewModel к вашему. – Martin

2

В качестве быстрого решения вы можете использовать скрытое поле вместо текстового поля и сохранить там значение.

В общем, если вы не хотите отображать или обновлять значение, зачем отправлять его на просмотр? Создайте ViewModel только с данными, которые вам действительно нужны в представлении, и отправьте их туда и обратно.

+1

Мне нравится этот подход, много работы, но я стараюсь создавать ViewModels всякий раз, когда могу. – Martin

-1

Создайте его как скрытое значение:

<input id="IsActive" type="hidden" value="true" /> 
3

Вы можете скрыть его как скрытое поле на странице:

<% Html.Hidden("IsActive"); %> 

НО !! это не рекомендуется делать. так как очень легко манипулировать значением, и вы этого не хотите.

Лучший способ - просто получить значение из БД.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Service service) 
{ 
    Service originalService = GetService(id); 

    UpdateModel(originalService, new string[] { "Field1thatyouwanttoupdate", "fieldname2" }); 
} 

Таким образом, вы обновляете все поля, которые хотите, но НЕ поле IsActive.

+0

Это должно быть принято как ответ. Свяжите только те поля, которые вы фактически разрешите обновлять. Никогда не доверяйте пользовательскому вводу. –

+1

@Jace Rhea - Если вы должны привязать только те поля, которые вы действительно разрешаете пользователю, то это не ответ. Ответ Якимыча о ViewModels есть. – Martin

+0

@Martin Извините, но я не согласен. Явным образом указывая, какие поля связываться в методе UpdateModel (исключая IsActive), поле IsActive никогда не будет обновляться. Да, вы также можете создать отдельный класс viewmodel, но это кажется лишней, ненужной работой. –

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