【发布时间】:2013-05-19 01:37:15
【问题描述】:
我有以下 ViewModel:
public class MyViewModel
{
public int Id { get; set; }
public string Title { get; set; }
public int ParentClassId { get; set; }
public List<AnotherClass> AnotherClassItems { get; set; }
}
在视图中,我只有 Title 的表单输入,以及不可编辑的 AnotherClassItems 列表 - 它们仅用于显示与类相关的项目列表。所有属性都是在“编辑”视图加载时设置的,但是当视图发布时,ParentClassId 和 AnotherClassItems 列表为空。这是来自控制器的 HttpPost ActionResult:
[HttpPost]
public ActionResult Edit(FormCollection collection, MyViewModel myviewmodel)
{
if (ModelState.IsValid)
{
//myviewmodel.ParentClassId and myviewmodel.AnotherClassItems are null??
}
return View(myviewmodel);
}
有没有办法在不将它们作为表单输入的情况下传递 ParentClassId 和 AnotherClassItems 属性?或者我应该为此使用 Viewbag 吗?
【问题讨论】:
-
您可以使用查询字符串。没有其他的。甚至 viewbag 都会失败。
-
如果您的要求实际上意味着“视图中没有 VISIBLE 表单输入,您应该能够通过添加
@Html.HiddenFor(model => model.ParentClassId)获得您想要的部分内容。您能告诉我们为什么您还想在 POST 上传递列表吗?有很多这种确切模式的 MVC 示例,我想您可能会发现这种方法不是大多数示例处理问题的方式。提示:您真的不想发送整个 List 在 POST 上通过网络返回 - 在处理的那个点有更好的方法来获取相同的数据。 -
出于安全原因,我试图避免使用隐藏的表单输入。此应用程序中将有多个用户,我不希望他们能够修改发布的数据并将项目保存在其他 ParentClassId 下。我认为隐藏表单输入有可能实现这一点是否正确?
-
至于在 POST 上传递列表 - 我只想在发布编辑操作后再次显示列表。我想我不想再次访问数据库来获取列表,只是为了保存数据库请求 - 但我会将数据保存到动作控制器内的数据库中,因此额外的检索查询不会太多的开销。这是显示列表的最佳方式吗? - 再次从数据库中获取它?我来自网络表单背景,这一切都是通过视图状态完成的 - 我仍在学习 MVC 并制定最佳实践。