在此方案中,默认模型绑定器似乎不绑定数据。有什么指针吗?
我有一个表单,在提交时会调用控制器操作
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
答案 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") %>
顺便说一下,您可以将模型展平为这三个属性,或者只是在您的操作方法中接受三个参数。然后,您可以在视图中保留简单名称。