MVC, UpdateModel ИЛИ удалить в зависимости от значения поля формы? - PullRequest
1 голос
/ 02 ноября 2009

Я очень новичок в этом, поэтому любая помощь приветствуется.

Я буду использовать отношение Dinners / RSVPs для детализации моей проблемы. Один ужин имеет много RSVP. На моей странице редактирования / просмотра Обеда я хочу иметь возможность редактировать информацию Обеда И информацию о RSVP.

У меня эта часть работает, основываясь на ответе, данном здесь Джеймсом С:

int i = 0;

foreach (var r in Dinner.RSVPs) {
  UpdateModel(r, "Dinner.RSVPs[" + i++ + "]");
}

Но что, если я хочу удалить RSVP на основании того, что пользователь установил флажок рядом с RSVP в представлении редактирования? Примерно так в режиме редактирования:

<% int i = 0;  
    foreach (var rsvp in Model.RSVPs){%>
    <%=Html.CheckBox("RemoveRSVP[" + i + "]") %>
    <%= Html.TextBox("Dinner.RSVPs[" + i + "].Name", rsvp.Name) %>
<% i++;
}%>

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

Dinner dinner = dinnerRepository.GetDinner(id);
int i = 0;

    foreach (var r in dinner.RSVPs) {
      if (Boolean.Equals(RemoveRSVP[i], true){
          dinner.RSVPs.Remove(r);
      else
           UpdateModel(r, "Dinner.RSVPs[" + i+ + "]");
      i++;
    }

Я не могу удалить / удалить RSVP с помощью UpdateModel, могу ли я?

Дайте мне знать, если что-то не понятно.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2009

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

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

dinner.RSVPs.Remove(r);

или

if (Boolean.Equals(RemoveRSVP[i], true)

Для # 1

Если ваш репозиторий поддерживается Linq 2 Sql, а RSVP является сущностью, вам обычно придется вызывать DeleteOnSubmit () для удаления записи из базы данных - просто вызывая Remove () в ассоциации будет недостаточно. Вы, вероятно, добавите одно из следующего в ваш DinnerRepository, чтобы сделать это:

DinnerRepository.DeleteRsvp(RSVP item)
DinnerRepository.DeleteRsvp(Dinner dinner, RSVP rsvp)

В качестве альтернативы, если вы хотите, чтобы LINQ выполнял удаление автоматически, вы можете отредактировать DBML как XML (щелкните правой кнопкой мыши, откройте с помощью редактора XML) и добавьте следующий атрибут в ассоциацию объектов:

<Association Name="..." ... DeleteOnNull="true" />

для # 2

Обычно я создаю этот тип формы «повторяющийся флажок удаления объекта», чтобы опубликованные значения представляли собой список идентификаторов объектов, которые я хочу удалить. Для этого я использую альтернативный помощник CheckBox:

public static class HtmlExtensions
{
    /// <summary>
    /// Alternate CheckBox helper allowing direct specification of "name", "value" and "checked" attributes.
    /// </summary>
    public static string CheckBox(this HtmlHelper html, string name, string value, bool isChecked)
    {
        string tag = String.Format("<input type=\"checkbox\" name=\"{0}\" value=\"{1}\" {2}/>",
            html.AttributeEncode(name),
            html.AttributeEncode(value),
            isChecked ? "checked=\"checked\" " : ""
            );
        return tag;
    }
}

и создайте флажки так:

<%= Html.CheckBox("RemoveRsvpIds", rsvp.RsvpId.ToString(), false) %>

и использовать список следующим образом:

public ActionResult TheFormInQuestion(int dinnerId, int[] removeRsvpIds)
{
    var dinner = DinnerRepository.GetDinner(dinnerId);

    foreach (var rsvp in dinner.RSVPs)
    {
        if (removeRsvpIds.Contains(rsvp.RsvpId))
        {
            // Perform Delete
        }
        else
        {
            // Perform Update
        }
    }

    // The rest
}

Я не могу удалить / удалить RSVP с помощью UpdateModel, могу ли я?

Цель UpdateModel () - автоматически копировать значения свойств из опубликованной формы в уже существующий объект, а не создавать новые или уничтожать существующие сущности. Так что нет, не совсем. Это не будет ожидаемым поведением.

0 голосов
/ 02 ноября 2009

Я не совсем знаком с кодом NerdDinner, но разве они не используют Linq to SQL для своего бэкэнда? Если это так, я думаю, вы могли бы заняться этим с помощью традиционного веб-подхода и добавить идентификатор записи к значению каждого флажка в списке элементов, которые необходимо удалить. Тогда вы могли бы перехватить коллекцию идентификаторов на стороне сервера и выполнить DeleteAllOnSubmit, передав запрос выбора сущностей вызову delete? Дайте мне знать, если вам нужно больше деталей.

...