gpt4 book ai didi

c# - 将数据从 View 发送到 Controller 时支持的类型

转载 作者:行者123 更新时间:2023-11-30 20:38:36 25 4
gpt4 key购买 nike

基本上,我想知道 MVC View @HTML 控件是否可以正确处理所有类型的数据。

例如我的 ViewModel 如下:

public class ViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public MyClass Obj { get; set; } //custom class
}

进入 View ,我将强类型 View :

@modem <NameSpace>.ViewModel

理想情况下,我希望View让用户填写Name并保留Id和Obj的记录

我最终会得到一个如下所示的表单:

@using (Html.BeginForm("MyAction", "MyController"))
{
@Html.Hidden("Id", Model.Id) // --> this will work
@Html.Hidden("Obj", Model.Obj)// --> this will NOT work
@Html.TextBox("Nom", null)// --> this will work
<input type="submit" value="Submit" />
}

Id 和 Name 将被正确提交,但我会将 viewModel.Obj = null 放入我的 Controller 中:

public ActionResult MyAction(ViewModel viewModel)

所以看起来 MVC 可以正确处理某些类型而不能处理一些更复杂的类型。谁能告诉我哪些类型有效,哪些无效?

还是我错过了一些明显的东西??

最佳答案

Html.HiddenFor 不适用于您的自定义类。您可以做的是为 Model.Obj 属性的不同属性创建表单元素,并将其命名为与 View 模型的属性层次结构相同,这样当您提交表单时,DefaultModelBinder 将能够映射表单字段的 ViewModel 对象属性。

@model ViewModel
@using (Html.BeginForm())
{
@Html.Hidden("Id", Model.Id)

@Html.Hidden("Obj.Id", Model.Obj.Id)
@Html.Hidden("Obj.Name", Model.Obj.Name)

@Html.TextBox("Nom", null)
<input type="submit" value="Submit" />
<input type="submit" />
}

假设 NameId 是您的 MyClass 的属性。

你的 HttpPost Action 看起来像

[HttpPost]
public ActionResult Index(ViewModel model)
{
// to do : Do something and return something
}

另一种解决方案是使用编辑器模板并像 Html.EditorFor(Model.Obk) 那样调用它,如 this post 中所述。 .

此外,除非绝对需要,否则不应设置表单中的所有属性值。相反,在 HttpPost 操作中,您应该使用数据库或某处的唯一标识符(表的主键?,您将其作为隐藏字段保存在表单中d)再次查询实体并根据需要使用它。

关于c# - 将数据从 View 发送到 Controller 时支持的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35024573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com