C# .net mvc视图未在post上返回模型
在我开始之前,我想说我搜索了一下,没有发现类似的东西C# .net mvc视图未在post上返回模型,c#,asp.net-mvc,C#,Asp.net Mvc,在我开始之前,我想说我搜索了一下,没有发现类似的东西 在我的解决方案中,我有一个模型,其中包含一些对象的列表 public class ModelView { public Owner owner = new Owner(); public Tenant tnt = new Tenant(); } 在我看来,我把这个类称为模型,就是这样 @model WebApp.Models.ModelView <form name="export_form" action="Exp
在我的解决方案中,我有一个模型,其中包含一些对象的列表
public class ModelView
{
public Owner owner = new Owner();
public Tenant tnt = new Tenant();
}
在我看来,我把这个类称为模型,就是这样
@model WebApp.Models.ModelView
<form name="export_form" action="Export" method="post">
<table cellpadding="2" cellspacing="2" border="0">
@if (Condition_1)
{
<tr>
<td>
<!-- ID -->
</td>
<td>
@Html.HiddenFor(model => model.owner.ID)
</td>
</tr>
<tr>
<td>
Name
</td>
<td>
@Html.EditorFor(model => model.owner.name)
</td>
</tr>
<tr>
<td>
Phone
</td>
<td>
@Html.CheckBoxFor(model => model.owner.is_Checked_Phone)
</td>
</tr>
}
else
{
<tr>
<td>
<!-- ID -->
</td>
<td>
@Html.HiddenFor(model => model.tnt.ID)
</td>
</tr>
<tr>
<td>
Name
</td>
<td>
@Html.EditorFor(model => model.tnt.name)
</td>
</tr>
<tr>
<td>
Adress
</td>
<td>
@Html.CheckBoxFor(model => model.tnt.is_Checked_Adress)
</td>
</tr>
}
</table>
<input type="submit" name="SaveStuff" value="Save" />
<input type="submit" name="ExportStuff" value="Export" />
</form>
这里的问题是,即使实体不是空的,我也会不断得到空值。有什么原因吗?不返回任何值更新
模型A 模型B
public partial class Tenant
{
public long ID{ get; set; }
public bool is_Checked_Name { get; set; }
public bool is_Checked_Adress { get; set; }
}
这些是使用EF自动生成的。您的代码存在多个问题。首先,视图中的模型是
ModelView
,例如,您可以生成以该模型属性名称为前缀的表单控件
<input type="checkbox" name="owner.is_Checked_Phone" ... />
下一个问题是,您的模型只有字段,而没有{get;set;}
属性,因此DefaultModelBinder
不能设置任何值。视图模型需要诸如public-Owner-Owner{get;set;}
之类的属性,并且在将模型传递给视图之前在控制器中或在ModelView
的无参数构造函数中设置该值
但是,视图模型不应包含作为数据模型的属性,而应是仅包含所需属性的平面结构。在你的情况下,应该是
public class ModelView
{
public long ID { get; set; }
[Display(Name = "Name")]
public bool IsNameSelected { get; set; }
[Display(Name = "Phone")]
public bool IsPhoneSelected { get; set; }
[Display(Name = "Address")]
public bool IsAddressSelected { get; set; }
// additional property to define if the form is for an Owner or Tenant
public bool IsOwner { get; set; }
}
在GET方法中
var model = new ModelView()
{
IsOwner = true // or false
};
return View(model);
在我看来
public ActionResult Save_Definition(ModelView model)
@model ModelView
....
@using (Html.BeginForm("Save_Definition"))
{
@Html.HiddenFor(m => m.ID)
@Html.HiddenFor(m => m.IsOwner)
@Html.CheckBoxFor(m => m.IsNameSelected )
@Html.LabelFor(m => m.IsNameSelected )
if (Model.IsOwner)
{
@Html.CheckBoxFor(m => m.IsPhoneSelected)
@Html.LabelFor(m => m.IsPhoneSelected)
}
else
{
@Html.CheckBoxFor(m => m.IsAddressSelected)
@Html.LabelFor(m => m.IsAddressSelected)
}
.... // submit buttons
}
在POST方法中,您可以检查model.isoowner
的值,以了解您是否提交了Owner
或Tenant
,并采取适当的操作
旁注:
元素用于表格数据。不要将其用于布局
,但您的POST方法是
命名为Save\u Definition
,因此不确定要使用哪种方法
将表格提交至如果post controller正在更改原始模型数据,则需要发出ModelState.Remove(“propertyname”),后跟model.propertyname=“new value”,然后是一个简单的返回视图(model)将更新已发布视图上更改的值。视图中的模型是
ModelView
,因此您的发布方法签名需要是public ActionResult Save\u Definition(ModelView模型)
才能匹配(或者,您可以使用BindAttribute
的Prefix
属性,但您使用包含数据模型的视图模型是一种糟糕的做法,您的视图模型应该是一个平面结构,包含视图中所需的属性。这是他的最小问题…@Aydinand,我正在写一篇评论解释原因。)您现在删除的答案是错误的:)我的方法是公开的&当我返回ModelView
时,这是同一个问题。而且这是我所知道的唯一一种多数据模型的做法,是否更好?谢谢你,等我有时间阅读你提供的文章时我会尝试。至于第三方注释Export
是控制器名称Save\u definition
,还有另一个方法是基于用户选择的提交方法(保存或导出),然后action=“Export”
将永远不会转到您的方法-它需要是action=“Export/Save\u defination”
(始终使用强类型助手).你的意思是什么?还有另一种方法?你有一些javascript修改action
属性的值吗?哦,我明白了。另一种方法是我的第二种方法。当我向外看时,我有两个提交按钮,我发现有三种方法可以处理它。或者通过执行多个表单,或者使用jquery(我想)或者在控制器中创建一个类,根据按钮名称重定向到actionresult
方法。如果有助于理解我的意思,我可以更新第二个操作方法&控制器中的类。它起作用了我只是想知道我只是想知道在模型中声明方法是否是一种好的做法在不知道您使用的代码的情况下获取或设置所有者
或租户
的构造函数很难说。如果它是视图模型,我通常会说它不是-您还需要一个无参数构造函数,否则在提交时会抛出异常,并且它是负责设置p的控制器不动产。
var model = new ModelView()
{
IsOwner = true // or false
};
return View(model);
@model ModelView
....
@using (Html.BeginForm("Save_Definition"))
{
@Html.HiddenFor(m => m.ID)
@Html.HiddenFor(m => m.IsOwner)
@Html.CheckBoxFor(m => m.IsNameSelected )
@Html.LabelFor(m => m.IsNameSelected )
if (Model.IsOwner)
{
@Html.CheckBoxFor(m => m.IsPhoneSelected)
@Html.LabelFor(m => m.IsPhoneSelected)
}
else
{
@Html.CheckBoxFor(m => m.IsAddressSelected)
@Html.LabelFor(m => m.IsAddressSelected)
}
.... // submit buttons
}