Get和Post的不同模型 - MVC

15

根据下面的问题,我理解应该可以在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;
}

控制器

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" />
}

你的视图引用了一个错误的类名...请删除那些“dsads”虚拟字符。你可能会收到一个模型类未知的错误。 - Robert Koritnik
2
为什么它不工作?发生了什么事? - SLaks
2
你缺少什么?你忘了在问题中包含你遇到的错误。 - Aliostad
抱歉遗漏了错误信息 - 我忘记说了,目的是在Edit方法中不抛出异常。 - Rasmus
2个回答

12

您的模型没有使用正确的访问器,因此无法进行模型绑定。将其更改为以下内容即可:

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; }
}

我认为那些类之所以缺少它们是为了简单起见,但除此之外它们是日常属性。:) 永远不要相信示例代码与原始代码有太大的区别 - Robert Koritnik

7

澄清一下

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

我们要处理的是:

  • 视图模型类型
  • 操作方法参数类型

因此,您的应用程序模型仍然是相同的。而GetModelPostModel只是这个模型中的两个类/类型。它们本质上不是模型。

不同的类型?当然可以!

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

您也可以拥有一个视图,其类型为GetModel,然后进行多个不同参数的post操作,例如:

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

或者其他任何内容。您只需要确保可以将帖子数据绑定到这些参数及其类型属性...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接