Связыватель модели по умолчанию не заполняет данные - PullRequest
0 голосов
/ 12 мая 2011

Связыватель модели по умолчанию не связывает данные в этом сценарии. Есть указатели?

У меня есть форма, которая при отправке вызывает действие контроллера

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 ]

1 голос
/ 12 мая 2011

В качестве модели у вас есть сложный объект (свойство PhoneDetails внутри класса).Вы должны сообщить MVC, какое поле к какому свойству относится, в вашем случае вы должны изменить имена текстовых полей, как показано ниже:

<%= Html.TextBox("args.Number") %>
<%= Html.TextBox("args.details.Phone") %>
<%= Html.TextBox("args.details.CountryCode") %>

Кстати, вы можете просто сгладить вашу модель только этими тремя свойствамиИли просто примите три параметра в вашем методе действия.Тогда вы можете сохранить простые имена в представлении.

1 голос
/ 12 мая 2011

Вы не передаете Модель вашему Частичному обзору.Сделайте это.

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

РЕДАКТИРОВАТЬ:

Когда я вижу ваш код, что страница не наследует правильный класс, который вы хотите связать, трудно сказать, как вы ограничиваете данныев поля ввода.Поскольку визуализация текстового поля со значением должна быть такой, как <%=Html.TextBox("FieldName", value) %> или <%=Html.TextBoxFor(model=>model.FieldName) %>, что я предпочитаю позже.

Предполагается, что вы перепривязываете поля после отправки формы.Поскольку представление не ограничено классом FetchArgs, вы можете поместить класс FetchArgs в ViewData и использовать эти ViewData для привязки ваших полей как модели.

На вашем контроллере я не уверенесли ActionMethod Fetch возвращает представление по вашему примеру или оно перенаправлено.Перенаправлено или нет, вы все равно можете поместить свои данные в ViewData, если FetchResults класс не имеет члена FetchArgs.

Если вы поместили свой класс FetchArgs в ViewData после отправки, вы можете затем вВаш View сделает это.

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

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

И Ваш PhoneDetails View

<%=Html.TextBox("Phone", Model.Phone) %>
<%=Html.TextBox("CountryCode", Model.CountryCode) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...