Asp.net mvc MVC、UpdateModel或delete取决于表单字段值?

Asp.net mvc MVC、UpdateModel或delete取决于表单字段值?,asp.net-mvc,updatemodel,Asp.net Mvc,Updatemodel,我对这方面还不熟悉,所以非常感谢您的帮助 我将使用Dinners/RSVPs关系来详细说明我的问题。一顿饭有很多副作用。 在我的晚餐编辑页面/视图中,我希望能够编辑晚餐信息和RSVPs信息 根据James S给出的答案,我让这部分工作: int i = 0; foreach (var r in Dinner.RSVPs) { UpdateModel(r, "Dinner.RSVPs[" + i++ + "]"); } 但是,如果我想根据用户单击编辑视图上RSVP旁边的复选框来删除RSVP

我对这方面还不熟悉,所以非常感谢您的帮助

我将使用Dinners/RSVPs关系来详细说明我的问题。一顿饭有很多副作用。 在我的晚餐编辑页面/视图中,我希望能够编辑晚餐信息和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++;
}%>
我无法使用UpdateModel删除/删除RSVP,可以吗

如果有什么不清楚的地方,请告诉我


谢谢。

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

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

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++;
    }
你真的很难通过删除吗?还是在处理表单时检测哪些应该删除?e、 g.哪一行不起作用:

dinner.RSVPs.Remove(r);

?

一 如果您的存储库由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" />
我无法使用UpdateModel删除/删除RSVP,可以吗


UpdateModel的目的是自动将属性值从发布表单复制到现有对象上,而不是创建新实体或销毁现有实体。所以不,不是真的。这不是预期的行为。

事实上,我对两者都有问题。第一部分我已经修好了。如果它实际上不删除任何东西,那么删除又有什么好处呢?我认为这个想法是一个实体有它自己的独立生存期,所以简单地改变另一个实体的属性不应该导致第一个实体被删除。但是,您可以表示希望发生这种情况。我已经编辑了我的回复,包括如何做到这一点。@johnycakes有什么进展吗?您有机会尝试这两种解决方案吗?
<Association Name="..." ... DeleteOnNull="true" />
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
}