【问题标题】:ASP.Net MVC4 ViewModel null properties and HttpPostASP.Net MVC4 ViewModel 空属性和 HttpPost
【发布时间】: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 =&gt; model.ParentClassId) 获得您想要的部分内容。您能告诉我们为什么您还想在 POST 上传递列表吗?有很多这种确切模式的 MVC 示例,我想您可能会发现这种方法不是大多数示例处理问题的方式。提示:您真的不想发送整个 List 在 POST 上通过网络返回 - 在处理的那个点有更好的方法来获取相同的数据。
  • 出于安全原因,我试图避免使用隐藏的表单输入。此应用程序中将有多个用户,我不希望他们能够修改发布的数据并将项目保存在其他 ParentClassId 下。我认为隐藏表单输入有可能实现这一点是否正确?
  • 至于在 POST 上传递列表 - 我只想在发布编辑操作后再次显示列表。我想我不想再次访问数据库来获取列表,只是为了保存数据库请求 - 但我会将数据保存到动作控制器内的数据库中,因此额外的检索查询不会太多的开销。这是显示列表的最佳方式吗? - 再次从数据库中获取它?我来自网络表单背景,这一切都是通过视图状态完成的 - 我仍在学习 MVC 并制定最佳实践。

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

请记住,表单只回发 HTML 输入字段。因此,如果您没有制作任何文本框或隐藏框,它们将不会发布到您的编辑操作中。

处理此问题的正确方法是将 ID 作为隐藏字段传递,然后从数据库/存储库中提取原始值。

然后将 Title 和 AnotherClassItems 的新值应用到您的模型并保存到存储库/数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多