MVC5为绑定

时间:2017-02-20 18:17:04

标签: asp.net-mvc bind

首先,抱歉我的英语不好。我来自巴西。我是.NET MVC5的初学者。

我有一个带有Task的模型类ID以及4个可编辑列。创建新的Task时,用户必须只填写其中的两个TaskTypeSubject)。其余两列(UserIDCreationDate)必须填充从系统获取的信息:用户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?

或.....

1 个答案:

答案 0 :(得分:0)

我不明白为什么您通过ViewBag将CreationDateApplicationUserId发送到视图并将其发回,这没有任何意义。有人可以轻松编辑html并伪造ApplicationUserIdCreationDate

如果您只是使用强类型视图,我认为您的生活会更容易。我的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 (重定向后获取)模式。当你有更复杂的动作/视图时,它会派上用场。