【问题标题】:MVC2 post model to actionMVC2 发布模型到行动
【发布时间】:2010-11-11 15:00:55
【问题描述】:

我将模型从强局部视图发布到控制器,如下所示:

[AcceptVerbs(HttpVerbs.Post)]
[Authorize]
public string ProcessRequest(Request request)
{
.
.
.

但是,模型到达动作但它不完整,即请求的复杂属性为空。

我正在将完整模型从另一个操作发送到视图,更改属性并发布到 ProcessRequest 操作,该操作接收不完整的内容。

有谁知道这可能是什么问题?

谢谢!

视图声明:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Models.Request>" %>...

属性绑定:

<% using (Ajax.BeginForm("ProcessRequest", Model, new AjaxOptions { HttpMethod = "post" }, new { id = "ajaxForm" }))
    {%>

    <%= Html.TextArea("ReplyContent", Model.Reply.ReplyContent, new { cols="100"})%><br />...

【问题讨论】:

  • 我们能看到你的模型对象和视图吗?
  • 您还应该使用 firebug 或任何类似工具检查 post 参数。这通常会告诉您问题可能出在哪里。
  • 视图和模型都非常大,无法放入此处。但是,我正在发布相关位。

标签: asp.net-mvc


【解决方案1】:

基本上,MVC 所做的是获取正在提交的表单的所有输入的值,以及来自 URL 的所有参数,创建一个您希望接收的类型的新对象,并分配它的值。

因此,假设表单具有输入“FirstName”、“LastName”和“PhoneNumber”。你的动作会发生什么相当于这样:

Request request = new Request();
request.FirstName = ReceivedValues["FirstName"] // Note that this is pseudocode, I'm making up the name for the "ReceivedValues" dictionary
request.LastName = ReceivedValues["LastName"]
(...)

这就是您将在请求对象中获得的内容(显然,不会分配模型中不存在的任何接收到的值)。

无论您将原始模型发送到视图时包含什么,一旦它进入浏览器并返回到您的操作(在发布表单之后),只有那些接收到的值仍然存在(您可以看到哪些值只需使用 Firebug 来检查您的 post 操作的内容,即可接收该操作)。

因此,没有从浏览器接收到的任何内容都是空的。

P.D.注意:我从你的问题中得知你是从 MVC 开始的,如果你真的知道我所说的一切并且遇到了更复杂的问题,对不起! :P

【讨论】:

  • 嗨,我想说我在 MVC 的中级水平。我边走边学(没有时间),并认为 MVC 实际上会序列化传递的模型,而不管表单上是否绑定了某些属性。基于所有这些,我将如何包含来自绑定到 Html.TextArea 的请求的复杂属性的信息......?请求通过Reply complex 属性(一个类)传送到视图。 Model.Request.Reply 绑定到 TextArea。如何发布请求 + 回复?谢谢!
  • 呵呵呵呵,是啊,边走边学的不止你一个^^。我不太明白您要完成的工作,但我通常将未发送到页面的数据存储在会话变量中(查看操作控制器中可用的 TempData 和 Session 字典)或直接存储在数据库中,并且根据从浏览器接收到的值对模型进行编程以检索它(即我收到 replyId = 1,并将 loadReply() 添加到从磁盘获取相关记录的模型对象)。
  • P.S.另外,考虑到您可以为“Request.Reply”创建一个输入字段,它的值将被发送回 Action。您不仅可以接收模型的直接属性,还可以接收模型属性的属性,这些属性也是对象。
  • 嗨,我该怎么做才能为 Request.Reply 创建一个输入字段? Request 是一个类,其属性是Reply,它也是一个类。当我从数据库加载请求时,回复以及请求类的一部分(EF 4.0. POCO)被加载。然后我将请求的直接“简单”属性绑定到各种控件,并将 Request.Reply.ReplyContent 绑定到 TextArea 控件。令我沮丧的是,Action 收到了 Request,但它的 Reply 属性为 null :( 我的目标是检索属性 Reply 不为 null 的 Request。
  • 对不起,我以为回复是一个简单的属性,而不是一个类。您可以包含该类属性的字段(例如 Request.Reply.Subject),并且将初始化一个回复对象并为其分配主题值。附言考虑到,无论您收到什么,它现在都与您的数据上下文断开了连接。如果您正在修改记录,请在控制器中再次获取记录,并使用 UpdateModel 方法使用从浏览器接收到的值更新记录的属性(您将获得可用的回复,作为额外的好处)。
【解决方案2】:

这是我痛苦的答案:

<%= Html.TextAreaFor(m=>m.Reply.ReplyContent, new { cols = "100" })%>

现在,Reply 作为 Request 的属性传送到 Action。

经过一番研究,我发现问题出在命名约定上,即以下错误:

<%= Html.TextArea("ReplyContent", Model.Reply.ReplyContent, new { cols="100"})%>

显然,TextAreaFor 负责合格的命名工作,从而使 DefaultBinder 正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2011-03-20
    相关资源
    最近更新 更多