1

我对此很陌生,因此不胜感激。

我将使用 Dinners/RSVPs 关系来详细说明我的问题。一顿晚餐有很多回复。在我的晚餐编辑页面/视图上,我希望能够编辑晚餐信息和回复信息。

根据James S在此处给出的答案,我有这部分工作:

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++;
    }

我不能使用 UpdateModel 删除/删除 RSVP 可以吗?

让我知道是否有任何不清楚的地方。

谢谢。

4

2 回答 2

0

我对 NerdDinner 代码并不完全熟悉,但他们不使用 Linq to SQL 作为后端吗?如果是这种情况,我认为您可以使用传统的 Web 方法解决此问题,并将记录 ID 附加到要删除的项目列表中每个复选框的值中。然后您可以在服务器端捕获 ID 集合并通过将实体选择查询传递给删除调用来执行 DeleteAllOnSubmit?如果您需要更多详细信息,请告诉我。

于 2009-11-02T18:24:38.080 回答
0

我试过这个,但它显然不起作用:

您在实际进行删除方面是否有困难?还是正在处理表单以检测应该删除哪些表单?例如哪一行不起作用:

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

我通常构建这种类型的“重复实体删除复选框”表单,以便发布的值是我要删除的实体 ID 的列表。为了促进这一点,我使用了一个备用 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
}

我不能使用 UpdateModel 删除/删除 RSVP 可以吗?

UpdateModel() 的目的是自动将属性值从发布的表单复制到已经存在的对象上——而不是创建新的实体或破坏现有的实体。所以不,不是真的。这不是预期的行为。

于 2009-11-03T00:24:08.853 回答