我在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 });
}
答案 0 :(得分:3)
答案 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。