0

我在 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

4 回答 4

3

尝试为每个值添加一个 HiddenFor

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

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

如果您需要提供一个值,我喜欢此处提供的已接受答案

于 2012-04-20T16:17:35.927 回答
3

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

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

编辑:为了使上述部分更清楚,我应该强调 glosrob 是正确的,因为您只需要EventId处理删除。其他一切只是为了显示正确的信息,以便用户可以验证他们正在删除正确的记录。我只是想指出标签不被视为表单数据,它们是一种视觉指示。

不过这里有几点需要注意:

首先,您EventId不应该对修改持开放态度,因此应该使用@Html.HiddenFor(m => m.EventId). 这会将其呈现为用户无法看到的隐藏字段。这并不意味着它不能被修改,您最终应该使用AntiForgeryToken来帮助解决这个问题。

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

// 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).

于 2012-04-20T16:31:12.607 回答
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)
于 2012-04-20T16:22:31.800 回答
1

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

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

当然,要做到这一点,您必须将您的操作方法更改为仅使用 ID。

于 2012-04-20T16:31:36.990 回答