Почему средство доступа к модели с именем «State» приводит к тому, что модель будет опубликована как нулевая? - PullRequest
1 голос
/ 13 сентября 2011

У меня была странная проблема с очень простой моделью. При отправке обратно в контроллер модель всегда была нулевой. Не найдя проблемы, я разобрал ее, перестроил модель, добавив средство доступа за раз.

В конце концов я обнаружил, что наличие строкового метода доступа с именем «State» и использование его в представлении вызывает проблему:

<%= Html.HiddenFor(m => m.State) %>

Почему это случилось?

Вот модель:

public class StudentSelectState
{
    public string State { get; set; }
    public int SelectedYear { get; set; }
    public IDictionary<string, string> Years { get; set; }
}

Вот контроллер:

    [HttpGet]
    public ActionResult SelectStudent()
    {
        var StudentYears = absenceServices.GetStudentYears();
        var state = new StudentSelectState {Years = Lists.StudentYearListToDictionary(StudentYears)};

        return View(state);
    }

    [HttpPost]
    public ActionResult SelectStudent(StudentSelectState state)
    {
        var StudentYears = absenceServices.GetStudentYears();

        state.Years = Lists.StudentYearListToDictionary(StudentYears);

        return View(state);
    }

и вот вид:

<% using (Html.BeginForm())
    {%>
    <%= Html.ValidationSummary() %>
        <%= Html.TextBoxFor(m => m.State) %>
        <%= Html.RadioButtonListFor(m => m.SelectedYear, Model.Years, "StudentYears") %>
    <div style="clear: both;">
        <input value="submit" />
    </div>
<% } %>

RadioButtonListFor - это HtmlHelper, который я написал для заполнения списков RadioButtonList.

Я использую Ninject 2.0 для внедрения сервисов в конструктор, но я не думаю, что это имеет отношение к этой проблеме.

Я мог бы переименовать метод доступа, но мне любопытно, почему это происходит.

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

Вы также можете переименовать аргумент вашего действия POST.

[HttpPost]
public ActionResult SelectStudent(StudentSelectState model)

Когда вы выполняете POST-форму, в запросе отправляется следующая форма:

State=abcd

Теперь связыватель модели по умолчаниювидит, что ваш аргумент действия называется состояние , и пытается привязать к нему значение abcd, которое, очевидно, не выполняется, поскольку переменная state не является строкой.Поэтому будьте осторожны при именовании свойств вашей модели представления.

Чтобы избежать подобных конфликтов, я предпочитаю называть свои аргументы действия model или viewModel.

Еще одна возможность, если вы неЧтобы переименовать что-либо, нужно использовать атрибут [BindPrefix], например:

[HttpPost]
public ActionResult SelectStudent([Bind(Prefix="")]StudentSelectState state)
0 голосов
/ 13 сентября 2011

Когда StudentSelectState отправляется обратно в контроллер, средство связывания режима по умолчанию (поскольку вы не используете IModelBinder) может не знать, когда поместить экземпляр StudentSelectState.

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

Для этого можно использовать скрытое поле или связать его с помощью пользовательского класса IModelBinder.

Надеюсь, это поможет.

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