MVC3:创建视图同时在对象和属性对象中填充数据
Posted
技术标签:
【中文标题】MVC3:创建视图同时在对象和属性对象中填充数据【英文标题】:MVC3: Create View populating data in object and in attribute object at same time 【发布时间】:2012-11-03 20:08:00 【问题描述】:我很确定以前已经回答过这个问题,但是我很难找到任何可以帮助我的东西。问题是:
我有一个泛型类和它的特化,比如一个 PERSON 和一个 CLIENT(它是一个 PERSON)。所以,我在数据库上有 2 个表,它们是:
PESSOA_FISICA
ID_PESSOA_FISICA Identity
TX_NOME Varchar(120)
TX_CPF Char(8)
DT_NASCIMENTO DateTime
CLIENTE_VAREJO
ID_CLIENTE_VAREJO Identity
ID_PESSOA_FISICA Int (FK to PESSOA_FISICA)
IN_STATUS Char(1)
TX_FILIAL Varchar(20)
对于 C# 类,我得到了这个:
[Table("PESSOA_FISICA")]
public class PessoaFisica
[Key]
[Column("ID_PESSOA_FISICA")]
public int? IDPessoaFisica get; set;
[Column("TX_NOME")]
public string Nome get; set;
[Column("TX_CPF")]
public string CPF get; set;
[Column("DT_NASCIMENTO")]
public DateTime Nascimento get; set;
[Table("CLIENTE_VAREJO")]
public class ClienteVarejo
[Key]
[Column("ID_CLIENTE_VAREJO")]
public int? IDClienteVarejo get;set;
[Column("ID_PESSOA_FISICA")]
[ForeignKey("PessoaFisica")]
public int IDPessoaFisica get; set;
public virtual PessoaFisica PessoaFisica get; set;
[Column("IN_STATUS")]
public String Status get; set;
[Column("TX_FILIAL")]
public String Filial get; set;
问题是......我只是不知道如何创建一个 CREATE 视图,该视图可以接受数据到 ClienteVarejo 模型,但同时也接受到 PessoaFisica(因为,每当我输入数据时一个新的 ClienteVarejo,我也必须为新的 PessoaFisica 输入数据。
我已经意识到,在一个强类型为 ClienteVarejo 的视图中,我可以使用 Razor 语法,例如:
@html.EditorFor(model => model.PessoaFisica.Nome)
但在我的情况下(即:同时创建两个对象),如何使模型验证发生在两个对象上?
感谢您能给我的任何帮助... :)
马塞洛·米拉 巴西里约热内卢
【问题讨论】:
【参考方案1】:不要将域模型用于您的视图。创建一个特定于您的视图的新 POCO 类。我们称之为 ViewModel。
public class CreateClientVM
[Required]
public string ClientName set;get;
[Required]
public string ContactPersonName set;get;
//other properties here as needed
现在在 GET
操作中创建此类的对象并传递给 View
方法。
public ActionResult CreateClient()
var vm=new CreateClientVM();
return View(vm);
使您的视图强类型化到 ViewModel 类。
@model CreateClientVM
@using(Html.BeginForm())
@Html.LabelFor(x=>x.ClientName)
@Html.TextBoxFor(x=>x.ClientName)
@Html.LabelFor(x=>x.ContactPersonName)
@Html.TextBoxFor(x=>x.ContactPersonName)
<input type="submit" />
当用户提交表单时,从视图模型中读取值并将其分配给您的域模式对象并保存。感谢 MVC 模型绑定。 :)
[HttpPost]
public ActionResult CreateClient(CreateClientVM model)
if(ModelState.IsValid)
var domainModelClient=new ClienteVarejo();
domainModelClient.Name=model.ClientName;
domainModelClient.ContactPerson=new ContactPerson();
domainModelClient.ContactPerson.Name=model.ContactPersonName;
yourRepositary.SaveClient(domainModelClient);
//If saved successfully, Redirect to another view (PRG pattern)
return RedirectToAction("ClientSaved");
return View(model);
【讨论】:
嘿,@Shyju,感谢您的帮助。这是肯定的! :D 我唯一剩下的担心是,在为这种情况的每个人使用 POCO 类时,我最终可能会得到两倍数量的类(一个用于真实模型,另一个用于查看这些模型)。但是,至少这是一个简单明了的解决方案。非常感谢!! :D以上是关于MVC3:创建视图同时在对象和属性对象中填充数据的主要内容,如果未能解决你的问题,请参考以下文章
MVC3 - 部分视图中的多个 Ajax 表单在刷新时都填充了相同的数据
根据上一个列表中选择的值填充下拉列表(asp.net mvc3)