首先,抱歉我的英语不好。我来自巴西。我是.NET MVC5的初学者。
我有一个带有Task
的模型类ID
以及4个可编辑列。创建新的Task
时,用户必须只填写其中的两个TaskType
和Subject
)。其余两列(UserID
和CreationDate
)必须填充从系统获取的信息:用户ID和当前日期。
然后,在Create
获取中,我将这两个信息放在ViewBag中:
public ActionResult Create()
{
ViewBag.TaskTypeID = new DAO.TaskTypesDAO().ListOfTypes();
ViewBag.ApplicationUserId = User.Identity.GetUserId();
ViewBag.CreationDate = DateTime.Now;
return View();
}
在View Create中,我试图首先包含此信息,而不显示它:
首先,我尝试了HiddenFor()
,之后尝试了DisplayFor()
@Html.LabelFor(model => model.CreationDate, "Creation Date")
@Html.DisplayFor(model => model.CreationDate)
@Html.HiddenFor(model => model.CreationDate)
@Html.LabelFor(model => model.ApplicationUserId, "Creator")
@Html.DisplayFor(model => model.User.Id)
@Html.HiddenFor(model => model.ApplicationUserId)
DisplayFor()
没有显示任何内容。
当我提交帖子Create
方法
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,TaskTypeID,Subject,CreationDate,ApplicationUserId")] Task task)
{
if (ModelState.IsValid)
{
db.Tasks.Add(task);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.TaskTypeID = new DAO.TaskTypesDAO().ListOfTypes();
ViewBag.ApplicationUserId = User.Identity.GetUserId();
ViewBag.CreationDate = DateTime.Now;
return View(tarefa);
}
ModelState无效,task.CreationDate和task.ApplicationUserId为空。
如何在创建帖子绑定之前包含这两个信息????
或者,如何包含和重新验证ModelState?
或.....
答案 0 :(得分:0)
我不明白为什么您通过ViewBag将CreationDate
和ApplicationUserId
发送到视图并将其发回,这没有任何意义。有人可以轻松编辑html并伪造ApplicationUserId
或CreationDate
。
如果您只是使用强类型视图,我认为您的生活会更容易。我的2美分将是:
将您想要显示的所有内容放在视图模型中(下拉列表,列表等)。
在这里,您可以使用填充SelectListItem
在下拉列表中显示您的任务类型(如果它足够简单,则可以使用枚举)。
[HttpGet]
public ActionResult Create()
{
var viewModel = new CreateTaskViewModel
{
// [...] Put info that you need to display on the view here
}
return View(viewModel);
}
在创建任务时获取当前日期和用户ID,这样用户就无法伪造此信息。创建任务后,如果要向用户显示该任务,只需使用Show
视图。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CreateTaskViewModel createTaskViewModel)
{
// If validation fails return to the view showing the errors
if (!ModelState.IsValid) { return View(createTaskViewModel); }
// [...] Create task object using info from viewModel
// and what else is necessary
db.Tasks.Add(task);
db.SaveChanges();
// [...] Fills view model to show info and redirect
return RedirectToAction("Show", showViewModel);
}
在视图上使用模型,不要在html上隐藏敏感信息。
@model CreateTaskViewModel
@Html.LabelFor(model => model.TaskType)
// Or a dropdown list
@Html.TextBoxFor(model => model.TaskType)
@Html.LabelFor(model => model.Subject)
@Html.TextBoxFor(model => model.Subject)
另一件对您来说非常有用的事情是 PRG (重定向后获取)模式。当你有更复杂的动作/视图时,它会派上用场。