为什么删除时模型没有值?

时间:2012-04-20 16:03:58

标签: asp.net-mvc asp.net-mvc-3 label

我在LabelFors中有我的值,但是当我做回发时,模型有默认值。

@using (Html.BeginForm("Delete", "Event", FormMethod.Post))
{
    <p>
        @Html.LabelFor(m => m.EventID, "Event ID")<br />
        @Html.LabelFor(m => m.EventID, Model.EventID.ToString())
    </p>
    <p>
        @Html.LabelFor(m => m.DayCode, "Type of Event")<br />
        @Html.LabelFor(m => m.DayCode, Model.DayCode.ToString())
    </p>
    <p>
        @Html.LabelFor(m => m.EventDate, "Date of Event")<br />
        @Html.LabelFor(m => m.EventDate, Model.EventDate.ToShortDateString())
    </p>
    <p>
        @Html.LabelFor(m => m.Subject, "Person or Interest")<br />
        @Html.LabelFor(m => m.Subject, Model.Subject)
    </p>
    <p>
        @Html.LabelFor(m => m.EventDesc, "Description")<br />
        @Html.LabelFor(m => m.EventDesc, Model.EventDesc)
    </p>

    <table>
        <tr>
            <td>
                @Html.ActionLink("Back", "Index", new { month = Model.EventDate.Month,
                                                        year = Model.EventDate.Year,
                                                        day = Model.EventDate.Day})
            </td>
            <td>            
                <input id="delete" type="submit" value="Submit Changes" />
            </td>
        </tr>
    </table>
}

        public ActionResult Delete(int eventID, int year, int month, int day)
        {
            //Find Event then return to Index
            EventModel thisEvent = EventRepository.getDayEvent(eventID, year, month, day);
            return View(thisEvent);
        }



        [HttpPost]
        public ActionResult Delete(EventModel deletedEvent) //here Model only has 0, "", and 1/1/0001
        {
            EventRepository.DeleteEvent(deletedEvent);
            return RedirectToAction("Index", new { year = deletedEvent.EventDate.Year, month = deletedEvent.EventDate.Month, day = deletedEvent.EventDate.Day });
        }

4 个答案:

答案 0 :(得分:3)

尝试为每个值添加HiddenFor

@Html.HiddenFor(m => m.EventID)

这将确保在提交表单时将值发回服务器。

如果您需要提供值,我喜欢here

提供的已接受答案

答案 1 :(得分:3)

您的模型为空,因为您的表单不包含任何数据。标签不被视为数据。它们是数据的标签。你需要的是:

@Html.LabelFor(m => m.Subject, "Person or Interest")<br /> 
@Html.DisplayFor(m => m.Subject)

编辑:为了使上述部分更加清晰,我应该强调,glosrob是正确的,因为您只需要EventId来处理删除。其他所有内容仅用于显示正确的信息,以便用户可以验证他们是否正在删除正确的记录。我只是想说明标签不被认为是表格数据,它们是一种视觉指示。

但这里有几点需要注意:

首先,您的EventId不应该可以修改,因此应该使用@Html.HiddenFor(m => m.EventId)进行渲染。这将使其成为用户无法看到的隐藏字段。这并不意味着它无法修改,您最终应该使用AntiForgeryToken来帮助解决这个问题。

其次,您不需要为标签指定字符串。您可以在viewmodel上执行此操作,而不是使用数据注释:

// DisplayName is in System.ComponentModel and not System.ComponentModel.DataAnnotations;
using System.ComponentModel;  

public class EventViewModel
{
    [DisplayName("Person or Interest")]
    public string Subject { get; set; }
}

然后在视图中,您可以使用@Html.LabelFor(m => m.Subject)

答案 2 :(得分:2)

好的,问题是你的表单只有标签,但没有输入。它的输入值被发送到服务器,然后ASP.NET MVC绑定到模型类。

而是(你只有标签,标签不是后期有效载荷的一部分)

@Html.LabelFor(m => m.EventDesc, "Description")<br />
@Html.LabelFor(m => m.EventDesc, Model.EventDesc)

你应该(文本框将呈现<input /> html标签)

@Html.LabelFor(m => m.EventDesc, "Description")<br />
@Html.TextBox(m => m.EventDesc)

我同意@glosrob的评论,您不必显示/允许编辑您的ID。它应该取决于隐藏的输入,因此它将正确绑定到POST上的模型

@Html.HiddenFor(m => m.EventID)

答案 3 :(得分:1)

在我看来,你的回发没有通过你想要删除的项目。您可以使用HiddenFor(m => m.EventID)来传递模型的ID,或者只是将其放在路径值中:

@using (Html.BeginForm("Delete", 
                       "Event", 
                       new { idToDelete = Model.EventID }, 
                       FormMethod.Post))

当然,为此,您必须将操作方法​​更改为仅使用ID。