MVC,UpdateModel或删除取决于表单字段值?

时间:2009-11-02 18:18:50

标签: asp.net-mvc updatemodel

我对此很新,所以感谢任何帮助。

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

根据詹姆斯S给出的答案here,我有那部分工作:

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吗?

如果有什么不清楚,请告诉我。

感谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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()的目的是将已发布表单中的属性值自动复制到已存在的对象上 - 而不是创建新实体或销毁现有实体。所以不,不是真的。这不是预期的行为。