默认模型Binder不填充数据

时间:2011-05-12 07:21:36

标签: c# asp.net-mvc asp.net-mvc-2

在此方案中,默认模型绑定器似乎不绑定数据。有什么指针吗?

我有一个表单,在提交时会调用控制器操作

public ActionResult Fetch(FetchArgs args)

FetchArgs定义为:

public class FetchArgs 
    {
        public int Number { get; set; }
        public PhoneDetails details {get;set;}
    }
public class PhoneDetails
    {
        public int Phone { get; set; }
        public int CountryCode {get;set;}
     }

表单看起来像 -

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

 //Other code 


 <%= Html.TextBox("Number")%>  //Value gets set by model binder

 <%Html.RenderPartial("PhoneDetails"); %>

PhoneDetails视图看起来像 -

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<PhoneDetails>" %>
 //Other code 
 <%= Html.TextBox("Phone")%>  //Value  does not get set by model binder in controller action 

 <%= Html.TextBox("CountryCode")%>  //Value does not get set by model binder

2 个答案:

答案 0 :(得分:1)

您没有将模型传递给部分视图。这样做。

<%Html.RenderPartial("PhoneDetails", Model.PhoneDetails); %>

编辑:

当我看到你的代码中的页面没有继承你要绑定的正确的类时,很难说你如何将数据绑定到输入字段。由于使用值呈现文本框应该与<%=Html.TextBox("FieldName", value) %><%=Html.TextBoxFor(model=>model.FieldName) %>相似,后者我更喜欢。

假设您在提交表单后重新绑定字段。由于视图不限于FetchArgs类,因此您可以将FetchArgs类放在ViewData中,并使用该ViewData将您的字段绑定为模型。

在您的控制器上,我不确定ActionMethod Fetch是否在您的示例中返回View,或者是否重定向。是否重定向,如果FetchResults类没有FetchArgs成员,您仍然可以将数据放入ViewData。

如果您在提交后将FetchArgs类放入ViewData,则可以在View中执行此操作。

<%
var fetchArgs = ViewData["FetchArgs"];
%>

<%=Html.TextBox("Number", fetchArgs != null ? fetchArgs.Number : "") %>
<%Html.RenderPartial("PhoneDetails", fetchArgs != null ? fetchArgs.PhoneDetails : null); %>

您的PhoneDetails查看

<%=Html.TextBox("Phone", Model.Phone) %>
<%=Html.TextBox("CountryCode", Model.CountryCode) %>

答案 1 :(得分:1)

您有一个复杂的对象(类中的PhoneDetails属性)作为模型。你必须让MVC知道哪个字段属于哪个属性,在你的情况下你必须改变文本框名称作为下面的代码,

<%= Html.TextBox("args.Number") %>
<%= Html.TextBox("args.details.Phone") %>
<%= Html.TextBox("args.details.CountryCode") %>
顺便说一下,您可以将模型展平为这三个属性,或者只是在您的操作方法中接受三个参数。然后,您可以在视图中保留简单名称。