Модель ASP.net MVC не может распознать значения - PullRequest
1 голос
/ 06 марта 2012

Как часть моего текущего проекта, я наткнулся на огромную веб-форму MVC, о которой я знаю относительно немного, и мне приходится делать довольно серьезные отладки на ней. У меня большой опыт работы с веб-формами, но мало с MVC, поэтому, пожалуйста, прости меня, если следующее не ясно или задает глупые вопросы.

Часть формы - это пользовательский элемент управления .ascx, который получает информацию с другого URL-адреса и ограничивает то, что пользователь может поместить в этот раздел формы на основе этой информации. Все элементы формы можно включать и выключать. Если вы включаете этот конкретный элемент формы, заполняете его и отправляете, то ModelState не проходит проверку проверки, жалуясь на отсутствие требуемого значения. Форма возвращается с включенным проблемным элементом, но без значений в полях. Если вы не включите этот конкретный элемент, ModelState правильно проверяет.

Я достаточно знаю о MVC, чтобы понять, что отображение между элементами формы и моделью происходит под капотом. Однако это делает его очень сложным для отладки. Я действительно понятия не имею, в чем проблема или, что еще хуже, как выяснить причину. Будем весьма благодарны за любые предложения с обеих сторон.

РЕДАКТИРОВАТЬ: некоторый код

//start to deal with specialist form user controls        
case    "ViewData.Customer.CustomFieldTypes.BlackWhiteListConfigViewData ":        
 if (Model.Visible)
   { %>
 <div class="formItem">
   <label>
    <%      Html.RenderPartial("~/Views/Shared/EditorTemplates/BlackWhiteListConfigViewData.ascx"); %>
</div>
<% }
   else
   { %>
 <%= Html.HiddenFor(m => Model.Value) %>
<% }
 b break;     

И обязательный код:

  switch (fieldType)
            {
                case FeatureFieldFactory.BlackWhiteListConfigElTypeName:
                    {
                        // create a new default model binder, and tell it which type we actually want it to bind.
                        BlackWhiteListConfigViewData model = new BlackWhiteListConfigViewData();
                        bindingContext.ModelMetadata =
                            ModelMetadataProviders.Current.GetMetadataForType(() => model, typeof(BlackWhiteListConfigViewData));

                        return base.BindModel(controllerContext, bindingContext);
                    }

РЕДАКТИРОВАТЬ: BlackWhiteListConfigViewData.ascx code

if (Model.Visible) {%>

    <script type="text/javascript">
        $(cpContext.CurrentService()).bind('onServiceAttributesReady', function (context) {
            $(document).ready(function () {
                $("#js-hook-BlackWhiteListLoading").hide();
                if (context.target.AttributeNames().length === 0) {
                    $("#js-hook-AddBlackWhiteListEntry").hide();
                    $("#js-hook-BlackWhiteListConfigTable").hide();
                    $("#js-hook-BlackWhiteListMessage").html('There are no attribute types present in the catalogue.  The Black and White lists can be configured once the catalogue is loaded.');
                    $("#js-hook-BlackWhiteListMessage").show();
                }
                else {
                    $("#js-hook-BlackWhiteListMessage").hide();
                    $("#js-hook-AddBlackWhiteListEntry").show();
                    $("#js-hook-BlackWhiteListConfigTable").show();
                }
            });
        });

        $(cpContext.CurrentService()).bind('onServiceAttributesError', function (context) {
            $(document).ready(function () {
                $("#js-hook-BlackWhiteListLoading").hide();
                $("#js-hook-AddBlackWhiteListEntry").hide();
                $("#js-hook-BlackWhiteListConfigTable").hide();
                $("#js-hook-BlackWhiteListMessage").html('No attribute types retrieved from service API.  The Black and White lists can be configured when a Build has been completed and service API is accessible.');
                $("#js-hook-BlackWhiteListMessage").show();
            });
        });

        cpContext.CurrentService().getAttributes();
    </script> 

    <div class="formItem narrow blackWhiteListConfig">
        <% using (Html.BeginCollectionItem("fields"))
           {
               Model.Value = "n/a";
        %>

            <%= Html.HiddenFor(m => Model.Id) %>
            <%= Html.HiddenFor(m => Model.Type) %>
            <%= Html.HiddenFor(m => Model.Name) %>
            <%= Html.HiddenFor(m => Model.Visible) %>
            <%= Html.HiddenFor(m => Model.DisplayName) %>
            <%= Html.HiddenFor(m => Model.Value) %>

            <table id="js-hook-BlackWhiteListConfigTable" class="configTable" style="display:none">
                <thead>
                    <tr><th class="configTableColumn">Key Attribute Type</th><th class="configTableColumn">Key Value</th><th class="transparent"></th><th class="configTableColumn">Related Attribute Type</th><th class="configTableColumn">Related Attribute Value</th><th class="configTableColumn narrow">Black</th><th class="configTableColumn narrow">White</th><th class="transparent" style="width:20px"></th></tr>
                </thead>
                <tbody class="blackWhiteListRows">
                <% foreach (BlackWhiteListEntryViewData entry in Model.Entries)
                   { %>
                        <%= Html.EditorForNested(e => entry) %>
                <% } %>
                </tbody>
            </table>

               <hr />
                <p id="js-hook-AddBlackWhiteListEntry" class="clear" style="display:none"><a  href="#">Add another entry</a></p>
                <p id="js-hook-BlackWhiteListMessage" class="clear" style="display:none">There are no attribute types present in the catalogue.  The Black and White lists can be configured once the catalogue is loaded.</p>
                <img id="js-hook-BlackWhiteListLoading" src="<%=Links.Content.images.content_loading_gif %>" alt="Loading Black and White list configuration..."
                     style="" class="clear" />
            <%= Html.ValidationMessageFor(m => Model) %>
    <% } %>

Model.Value)%>

Ура, Matt

1 Ответ

0 голосов
/ 06 марта 2012

Попробуйте заменить:

<% Html.RenderPartial("~/Views/Shared/EditorTemplates/BlackWhiteListConfigViewData.ascx"); %>

с:

<%= Html.EditorForModel() %>

или, если тип вашей модели не BlackWhiteListConfigViewData, вы можете указать его:

<%= Html.EditorForModel("BlackWhiteListConfigViewData") %>

Также внутри вашего шаблона редактора вы, кажется, используете несколько пользовательских помощников, таких как Html.EditorForNested. Убедитесь, что имена полей ввода соответствуют соглашениям для привязки к списку .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...