Get和Post的不同模型 - MVC

时间:2011-10-11 12:59:48

标签: asp.net-mvc asp.net-mvc-3 model-binding

根据我从下面的问题中理解,应该可以为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" />
}

2 个答案:

答案 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是一组表示某些应用程序状态/数据的类/类型。因此应用程序数据模型。

我们在这里处理的是:

  • 查看模型类型
  • 操作方法参数类型

所以你的应用程序模型仍然是一样的。此GetModelPostModel只是此模型中的两个类/类型。他们本身并不是模特。

不同类型?我们当然可以!

在您的情况下,您使用的是视图模型类型GetModel,然后将其数据传递给PostModel操作参数。由于这两个类/类型都具有相同匹配名称的属性,因此默认模型绑定器将能够填充PostModel属性。如果属性名称不相同,则必须更改视图以重命名输入以反映POST操作类型属性名称。

您也可以使用GetModel类型的视图,然后使用以下几个不同的参数发布操作:

public ActionResult Edit(Person person, IList<Address> addresses)
{
    ...
}

或其他任何事情。您只需要确保发布数据可以绑定到这些参数及其类型属性...