根据我从下面的问题中理解,应该可以为Get和Post操作使用不同的模型。但不知何故,我未能实现这一目标。
我错过了什么?
相关问题:Using two different Models in controller action for POST and GET
模型
public class GetModel
{
public string FullName;
public string Name;
public int Id;
}
public class PostModel
{
public string Name;
public int Id;
}
控制器
public class HomeController : Controller
{
public ActionResult Edit()
{
return View(new GetModel {Id = 12, Name = "Olson", FullName = "Peggy Olson"});
}
[HttpPost]
public ActionResult Edit(PostModel postModel)
{
if(postModel.Name == null)
throw new Exception("PostModel was not filled correct");
return View();
}
}
查看
@model MvcApplication1.Models.GetModel
@using (Html.BeginForm()) {
@Html.EditorFor(x => x.Id)
@Html.EditorFor(x=>x.Name)
<input type="submit" value="Save" />
}
答案 0 :(得分:9)
您的模型未使用正确的访问器,因此模型绑定不起作用。将它们更改为此应该可以正常工作:
public class GetModel
{
public string FullName { get; set; }
public string Name { get; set; }
public int Id { get; set; }
}
public class PostModel
{
public string Name { get; set; }
public int Id { get; set; }
}
答案 1 :(得分:6)
GET和POST控制器操作可以轻松使用他们需要的任何类型。实际上我们不是在谈论模型。 Model是一组表示某些应用程序状态/数据的类/类型。因此应用程序或数据模型。
我们在这里处理的是:
所以你的应用程序模型仍然是一样的。此GetModel
和PostModel
只是此模型中的两个类/类型。他们本身并不是模特。
在您的情况下,您使用的是视图模型类型GetModel
,然后将其数据传递给PostModel
操作参数。由于这两个类/类型都具有相同匹配名称的属性,因此默认模型绑定器将能够填充PostModel
属性。如果属性名称不相同,则必须更改视图以重命名输入以反映POST操作类型属性名称。
您也可以使用GetModel
类型的视图,然后使用以下几个不同的参数发布操作:
public ActionResult Edit(Person person, IList<Address> addresses)
{
...
}
或其他任何事情。您只需要确保发布数据可以绑定到这些参数及其类型属性...