Каков наилучший способ доступа к модели из представления, если модель является необязательной? - PullRequest
3 голосов
/ 29 ноября 2011

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

Мой контроллер:

AccountController {
    ...
    ActionResult LogOn() {
        return View()
    }

    [HttpPost]
    ActionResult LogOn(LogOnModel model) {
        return View(model)
    }
}

Мой вид:

<% if (!String.IsNullOrEmpty(Model.UserName)) { %>
    <div class="username"><% Response.Write(Model.UserName); %></div>
<% } %>

Конечно,проблема с приведенным выше кодом заключается в том, что я получаю сообщение об ошибке "Ссылка на объект не установлена ​​для экземпляра объекта" в строке, которая ссылается на Model.UserName .

Каков на мой взгляд лучший способ поддержать оба действия?Я могу заменить метод HttpGet LogOn следующим образом:

ActionResult LogOn() {
    result View(new LogOnModel()); 
}

Это работает, но выглядит не очень элегантно, и я уверен, что пустая модель сломает некоторые более сложные модели, которые мне нужно будет создать позже.на.Есть ли способ лучше?Спасибо!

Ответы [ 3 ]

2 голосов
/ 29 ноября 2011

Каков на мой взгляд лучший способ поддержки обоих действий?

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

Что в значительной степени является бла-бла, что в основном означает, что это означает:

ActionResult LogOn() {
    return View(new LogOnModel())
}

Этоработает, но выглядит не очень элегантно, и я уверен, что пустая модель сломает некоторые более сложные модели, которые мне нужно будет создать позже.

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

Кроме того, как примечание, вы никогда не должны использовать Response.Write в представлении.Таким образом, вместо:

<% Response.Write(Model.UserName); %>

вы полностью хотите:

<%= Html.DisplayFor(x => x.UserName) %>

или:

<%: Model.UserName %>

, но лично я предпочитаю помощника DisplayFor, так как это займетзабота о любых метаданных.

0 голосов
/ 29 ноября 2011

Как отметили другие комментаторы, ваш контроллер должен поддерживать строгость вашего представления. Но если вы настаиваете на продолжении анти-паттерна. Заменить это:

<% if (!String.IsNullOrEmpty(Model.UserName)) { %>
    <div class="username"><% Response.Write(Model.UserName); %></div>
<% } %>

с этим:

<% if (Model!= null && !String.IsNullOrEmpty(Model.UserName)) { %>
    <div class="username"><% Response.Write(Model.UserName); %></div>
<% } %>
0 голосов
/ 29 ноября 2011

Вы можете вернуть другой вид или, как вы это сделали, вернуть новую модель.

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