Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取强类型MVC视图以发回模型it';什么事过去了?_C#_Asp.net Mvc_Asp.net Mvc 4_Strongly Typed View - Fatal编程技术网

C# 如何获取强类型MVC视图以发回模型it';什么事过去了?

C# 如何获取强类型MVC视图以发回模型it';什么事过去了?,c#,asp.net-mvc,asp.net-mvc-4,strongly-typed-view,C#,Asp.net Mvc,Asp.net Mvc 4,Strongly Typed View,因此,我尝试使用我编写的视图创建模型实例,并使用它编辑数据库中的现有实例 因此,通过ID传入现有实例非常简单 public ActionResult Index(int id) { return View(EntityContext.Policies.Where(x => x.ID == id).First()); } 我遇到的问题是,当表单发布时: @using (Html.BeginForm("Index", "Save", FormMethod.Post, new { @i

因此,我尝试使用我编写的视图创建模型实例,并使用它编辑数据库中的现有实例

因此,通过ID传入现有实例非常简单

public ActionResult Index(int id)
{
    return View(EntityContext.Policies.Where(x => x.ID == id).First());
}
我遇到的问题是,当表单发布时:

@using (Html.BeginForm("Index", "Save", FormMethod.Post, new { @id = "form" }))
{
    <fieldset>
        ...
        @Html.TextBox("property")
        @Html.TextBoxFor("otherProperty")
        ...
        <input id="submit" type="submit" value="Save" />
    </fieldset>
}
控制器获得一个策略对象,但它只在其中设置了我在视图中显示并允许编辑的字段

我想做的是让视图发布它从原始控制器获得的实例。这是我能简单地做到的吗


我所知道的实现这一点的最简单方法是在视图上为策略的ID创建一个隐藏字段,然后点击数据库以撤回原始实例。由于某些特定于域的内容,我已经不得不比我希望的更多地访问数据库,因此如果我可以避免这种情况,我希望这样做。

我会将其粘贴到一个隐藏字段中。是的,你可以简单地做到

@Html.HiddenFor(m => m.ID)
我只是随便猜测一下,您在模型中定义了一个
ID
。但您可以将其更改为您想要的任何内容。

更正:

我所知道的最简单、最安全的方法是在视图上为策略的ID创建一个隐藏字段,然后点击数据库以撤回原始实例

如果您将整个记录发送给客户机,然后允许该客户机将其发回,则即使您不“允许”客户机编辑字段,您也将该记录的完全控制权交给了客户机。因为偷偷摸摸的客户端可以绕过你的应用程序,直接发布他们想要的任何数据并更改这些字段。因此,这样做既危险又不安全。即使你信任你的客户,这也不是一个好主意

安全的做法是只获取要输入的字段,并将其应用于从数据库服务器端检索的记录。这样,只有您允许他们更新的数据才会更改

但是,如果您已绑定并确定,则执行此操作的方法是为您不希望用户看到或编辑的所有变量创建隐藏字段。如果你想让他们看到字段,但不想编辑,你可以使用文本框,并将字段设置为只读(同样,用户可以绕过此设置,因此这不是真正的安全性)。或者只是显示数据并使用隐藏的输入


web浏览器仅发布表单元素中未禁用的表单控件中存在的数据。(或在ajax请求中发送的数据)。因此,任何要发布回服务器的数据都必须存在于控件中。

您有几个选项,其中一些您已经知道:

  • 传递
    id
    ,然后从数据库中重新检索
  • 将对象存储在模型中,将其值隐藏在隐藏字段中,然后将其整体传回
  • 在会话或其他可用的缓存机制中以某种方式缓存对象(在会话中存储对象不是一个好主意)

  • 由于HTTP是无状态的,所以控制器不会保留关于哪个模型被发送到哪个客户端的信息

    我会使用隐藏输入,但如果不想在视图中保存会话变量,可以使用会话变量。会话[“名称”]=“某个名称”。但这不是一个好的做法。如果要这样做,每个属性都需要渲染为隐藏属性。不建议这样做,因为用户可以对他们无权访问的字段进行任何修改。您可以将策略对象序列化为视图的JSON,然后将JSON(以及编辑的字段)发送到HTTP POST操作。
    @Html.HiddenFor(m => m.ID)