我将模型从强部分视图发布到控制器,如下所示:
[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 />...
答案 0 :(得分:3)
基本上,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"]
(...)
这就是你在请求对象中得到的东西(显然,不会分配模型中不存在的任何接收到的值)。
无论您将原始模型发送到View时的原始模型,一旦它进入浏览器,然后返回到您的操作(发布表单后),只有那些接收到的值仍然存在(您可以看到哪些值只需使用Firebug检查您的帖子操作内容即可接收该操作。
因此,未从浏览器收到的任何内容都为空。
Pd积。注意:我从你的问题中得知你是从MVC开始的,如果你真的知道我所说的一切并且有更复杂的问题,对不起! :P
答案 1 :(得分:0)
这是我痛苦的答案:
<%= Html.TextAreaFor(m=>m.Reply.ReplyContent, new { cols = "100" })%>
现在,回复作为请求的属性传递给行动。
经过一番研究,我发现问题在于命名约定,即以下是错误的:
<%= Html.TextArea("ReplyContent", Model.Reply.ReplyContent, new { cols="100"})%>
显然,TextAreaFor负责合格的命名工作,从而使DefaultBinder正常工作。