понедельник, 12 сентября 2011 г.

Учебные проекты должны быть полезными - Learn Them All!

На выходных потянуло потренироваться с Python и Google App Engine. Но писать бессмыслицу не хотелось, к тому же давно планировал сделать удобное (по крайней мере для себя) и самое главное максимально простое (с точки зрения пользователя) облачное приложение, позволяющее заносить в список неизвестные слова иностранного языка и учить их, используя, например "Мозаику" (дальше пример).

Вот это приложение - Learn Them All:


Единственное на данный момент упражнение - это "Мозаика":


Принцип прост - входим с помощью аккаунта Google (у каждого пользователя - свои слова), добавляем слова, затем переходим к упражнению. Верный ответ (правильно сопоставлена пара) - это +1 к счету для данного слова, иначе -1. Когда счет больше 5, слово уже не появляется в упражнении. Слова можно редактировать (включая счет для данного слова). Также из списка слов можно перейти на страницу Лингво.Про - посмотреть варианты перевода, примеры использования, найти транскрипцию или прослушать слово. Да, еще одно: список слов поддается сортировке путем щелчка по заголовку столбца.

Функциональности пока не много (а где-то еще нужна оптимизация), зато все просто и ясно. Возможно, еще будет приложение для Андроида с аналогичной функциональностью, позволяющего учиться оффлайн, иногда синхронизируясь с веб-приложением.

Кому интересно - можно посмотреть (вход, используя аккаунт Google).

Особенность Html.TextBoxFor() в ASP.NET MVC 2

Если вы активно используете HTML хелперы в ASP.NET MVC фреймворке, вам наверняка известен TextBoxFor() - о нем и пойдет речь.

Допустим, вы создаете форму с методом GET с целью организовать фильтр.

Контроллер и модель:

public class HomeController : Controller
{
    private static readonly string[] Fields = new[] {"Ann", "George", "Fred", "Amanda"};

    public ActionResult Search(SearchModel searchModel)
    {
        searchModel = searchModel ?? new SearchModel();
        searchModel.Field = searchModel.Field ?? string.Empty;

        searchModel.Field = Fields.FirstOrDefault(x => x.Contains(searchModel.Field));

        return View(searchModel);
    }
}

public class SearchModel
{
    public string Field { get; set; }
}

Представление:

<% using (Html.BeginForm("Search", "Home", FormMethod.Get)) { %>
    <%= Html.TextBoxFor(x => x.Field) %>
<% } %>
<form action="<%= Url.Action("Search") %>" method="get">
    <input id="Field" name="Field" type="text" value="<%= Model.Field %>" />
</form>

Запустив приложение, получим:

Введем во второе поле "g" и отправим форму нажатием на Enter. Вот что придет в ответ:

Почему в первом поле "g", когда должно быть "George", как во втором? Все просто, фреймворк анализирует строку запроса, и предпочитает значение Field=g из нее значению, приходящему в модели (Model.Field), что не плохо учитывать при разработке.

При этом, если интересно, вот во что рендерится представление: