Get和Post的不同模型 - MVC

Ras*_*mus 9 asp.net-mvc model-binding asp.net-mvc-3

正如我从下面的问题中理解的那样,应该可以为Get和Post操作使用不同的模型.但不知何故,我未能实现这一目标.

我错过了什么?

相关问题:在控制器操作中使用两个不同的模型进行POST和GET

模型

public class GetModel
{
    public string FullName;
    public string Name;
    public int Id;
}

public class PostModel
{
    public string Name;
    public int Id;
}
Run Code Online (Sandbox Code Playgroud)

调节器

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

视图

@model MvcApplication1.Models.GetModel
@using (Html.BeginForm()) {
    @Html.EditorFor(x => x.Id)
    @Html.EditorFor(x=>x.Name)
    <input type="submit" value="Save" />
}
Run Code Online (Sandbox Code Playgroud)

Tra*_*x72 10

您的模型没有使用正确的访问器,因此模型绑定不起作用.将它们更改为此,它应该工作:

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; }
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*nik 6

一点澄清

GET和POST控制器操作可以轻松使用他们需要的任何类型.实际上我们不是在谈论模型.Model是一组表示某些应用程序状态/数据的类/类型.因此应用程序数据模型.

我们在这里处理的是:

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

所以你的应用程序模型仍然是一样的.而GetModelPostModel在这个模型中只有两个类/类型.他们不是模特本身.

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

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

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

public ActionResult Edit(Person person, IList<Address> addresses)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

或其他任何东西.您只需要确保后期数据可以绑定到这些参数及其类型属性...