Member 12658724 Ответов: 1

Передача модели между видом и контроллером


Я хочу изменить значения свойств объекта в MVC.
@model Test.Web.Models.CountryLanguageModel

<div class="col-md-8 col-md-offset-2">
        @using (Html.BeginForm())
        {
            @Html.ValidationSummary(true)
            <fieldset>
                <legend>Language Edit</legend>

                @Html.HiddenFor(model => model.CountryId)

                <div class="editor-label">
                    @Html.LabelFor(model => model.CountryLanguage.LanguageName)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.CountryLanguage.LanguageName)
                </div>

                <div class="editor-label">
                    @Html.LabelFor(model => model.CountryLanguage.Message)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.CountryLanguage.Message)
                </div>
          
                <br />
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <input type="submit" value="Save" class="btn btn-default" />
                    </div>
                </div>
            </fieldset>
        }
    </div>


И в контролере. У меня есть два способа.
public ActionResult LanguageEdit(int id)
       {
           var model = new CountryLanguageModel();
           model.CountryLanguageId = id;
           var CountryLanguage = CountryService.Get(x => x.LanguageId == id);
           model.CountryLanguage = CountryLanguage;
           return View(model);
       }

       [HttpPost]
       public ActionResult LanguageEdit(CountryLanguageModel CountryLanguageModel)
       {
           if (ModelState.IsValid)
           {
           }
           var model = new CountryLanguageModel();
           model.CountryLanguageId = CountryLanguageModel.CountryLanguageId;
           var CountryLanguage = CountryService.Get(x => x.LanguageId == model.CountryLanguageId);
           model.CountryLanguage = CountryLanguage;
           return View(model);
       }


В первом методе он работает правильно
public ActionResult LanguageEdit(int id)

Мой вопрос заключается во втором методе
public ActionResult LanguageEdit(CountryLanguageModel CountryLanguageModel)

Я не вижу изменений в модели.

Что я уже пробовал:

Например, я нашел во втором способе. model.CountryLanguage является нулевым. Это означает, что я не смог пройти модель.

F-ES Sitecore

Вы всегда должны использовать CountryLanguageModel, а не создавать новый экземпляр модели. Если CountryLanguage равен null, то используйте отладчик для пошагового просмотра кода, чтобы увидеть, где он идет не так. Это " CountryLanguageModel.CountryLanguageId " правильно? Является ли "CountryLanguage" нулевым после CountryService. Get?

Member 12658724

Вы правы. Я не должен создавать новый экземпляр. CountryLanguage не является нулевым.

1 Ответов

Рейтинг:
0

David_Wimbley

Ваша проблема заключается в том, как привязка модели в MVC обрабатывает сложные объекты для использования в HTML-помощниках, что, по вашему мнению, и происходит. Поскольку вы не опубликовали свою модель, я предполагаю, что ваша модель выглядит примерно так

public class CountryLanguageModel
{
   public CountryLanguage CountryLanguage {get;set;}
}

public class CountryLanguage
{
   public string LanguageName {get;set;
}


Потому что ваш взгляд реализует @Html.EditorFor(model => model.CountryLanguage.LanguageName) это будет выглядеть в HTML как что-то вроде <input type="text" id="CountryLanguage_LanguageName" name="CountryLanguage_LanguageName" />.

Когда вы смотрите на свою модель CountryLanguage в своем пост-действии, скорее всего, этот класс не имеет имени свойства public string CountryLanguage_LanguageName скорее всего, ваше действие Post ищет свойства, размещенные в этом действии через привязку модели behind the scenes, чтобы быть просто LanguageName.


Самым простым решением здесь было бы изменить свой взгляд на то, чтобы либо использовать свою модель, чтобы быть @Model CountryLanguage или, если это невозможно, создайте частичное представление, передайте его Model.CountryLanguage из родительского представления в частичное представление, которое вы создаете, чтобы успокоить привязку модели MVC. Что это сделает, так это изменит приведенный выше пример CountryLanguage_LanguageName, чтобы он выглядел примерно так @Html.EditorFor(model=>model.LanguageName) который рендерит html так, чтобы он выглядел примерно так <input type="text" id="LanguageName" name="LanguageName" />

Другой вариант-не использовать строго типизированное представление, а вместо этого указать атрибуты с помощью @Html.Editor вместо @Html.EditorFor Это будет выглядеть примерно так @Html.Editor("LanguageName", @Model.CountryLanguage.LanguageName") который должен (я ухожу из памяти) визуализировать HTML, который выглядит примерно так <input type="text" name="LanguageName" id="LanguageName"/>

Если эти параметры для вас невозможны, то вам нужно изучить пользовательские параметры привязки модели/сопоставления свойств в MVC. Лично я, если когда-нибудь столкнусь с этой проблемой, пойду по пути частичных взглядов.

Вот несколько ссылок из быстрого поиска, которые могут быть полезны, если вы решите пойти по пути привязки пользовательской модели:

asp.net mvc 4-Underscore string model binder-переполнение стека[^]

[^]

Редактировать:

Снова посмотрел на ваше действие post и увидел, что это CountryLanguageModel, так что если по какой-либо причине ваше действие Post действительно требует сложного объекта класса CountryLanguageModel с классом CountryLanguage в качестве свойства LanguageModel, то вам, возможно, придется заглянуть в пользовательское решение привязки модели, но я бы также посмотрел и переосмыслил вашу структуру класса, если это возможно.