--HG--
branch : dev
This commit is contained in:
Renaud Paquay
2010-07-29 18:18:53 -07:00
22 changed files with 185 additions and 62 deletions

View File

@@ -788,6 +788,11 @@ msgstr "Nom"
msgid "Title"
msgstr "Titre"
#: ~/Core/Reports/Views/Admin/Index.aspx
#| msgid "Date"
msgid "Date"
msgstr "Date"
#: ~/Core/Routable/Drivers/RoutePartDriver.cs
#| msgid "Please do not use any of the following characters in your slugs: \"/\", \":\", \"?\", \"#\", \"[\", \"]\", \"@\", \"!\", \"$\", \"&\", \"'\", \"(\", \")\", \"*\", \"+\", \",\", \";\", \"=\". No spaces are allowed (please use dashes or underscores instead)."
msgid "Please do not use any of the following characters in your slugs: \"/\", \":\", \"?\", \"#\", \"[\", \"]\", \"@\", \"!\", \"$\", \"&\", \"'\", \"(\", \")\", \"*\", \"+\", \",\", \";\", \"=\". No spaces are allowed (please use dashes or underscores instead)."
@@ -2028,6 +2033,26 @@ msgstr "Permettre les nouveaux commentaires"
msgid "Enable to show the comment form. Disabling still allows the existing comments to be shown but does not allow the conversation to continue."
msgstr "Permettre l'affichage du formulaire de commentaire. Désactiver ceci permet aux commentaires existants d'être affichés mais ne permet pas à la conversation de se prolonger."
#: ~/Modules/Orchard.Comments/Views/EditorTemplates/Parts/Comments.Comments.ascx
#| msgid "Comments"
msgid "Comments"
msgstr "Commentaires"
#: ~/Modules/Orchard.Comments/Views/EditorTemplates/Parts/Comments.Comments.ascx
#| msgid "Comments are shown. Existing comments are displayed."
msgid "Comments are shown. Existing comments are displayed."
msgstr "Les commentaires existants sont affichés."
#: ~/Modules/Orchard.Comments/Views/EditorTemplates/Parts/Comments.Comments.ascx
#| msgid "Allow new comments"
msgid "Allow new comments"
msgstr "Autoriser les nouveaux commentaires"
#: ~/Modules/Orchard.Comments/Views/EditorTemplates/Parts/Comments.Comments.ascx
#| msgid "Enable to show the comment form. Disabling still allows the existing comments to be shown but does not allow the conversation to continue."
msgid "Enable to show the comment form. Disabling still allows the existing comments to be shown but does not allow the conversation to continue."
msgstr "Afficher le formulaire d'entrée des commentaires. Désactiver ne supprime pas l'affichage des commentaires existants mais empêche la poursuite de la conversation."
#: ~/Modules/Orchard.Comments/Views/EditorTemplates/Parts/Comments.SiteSettings.ascx
#| msgid "Comments"
msgid "Comments"
@@ -2048,6 +2073,11 @@ msgstr "Activer la protection contre le Spam"
msgid "Akismet key"
msgstr "Clé Akismet"
#: ~/Modules/Orchard.Comments/Views/EditorTemplates/Parts/Comments.SiteSettings.ascx
#| msgid "Akismet endpoint URL"
msgid "Akismet endpoint URL"
msgstr "URL du service Akismet"
#: ~/Modules/Orchard.Comments/Views/EditorTemplates/Parts/Comments.SiteSettings.ascx
#| msgid "Blog URL"
msgid "Blog URL"
@@ -2129,8 +2159,8 @@ msgid "The \"{0}\" field has been removed."
msgstr "Le champ \"{0}\" a été enlevé."
#: ~/Modules/Orchard.ContentTypes/Views/Admin/AddFieldTo.ascx
#| msgid "Add a new field to \"{0}\""
msgid "Add a new field to \"{0}\""
#| msgid "Add New Field To \"{0}\""
msgid "Add New Field To \"{0}\""
msgstr "Ajouter un nouveau champ à '{0}'"
#: ~/Modules/Orchard.ContentTypes/Views/Admin/AddFieldTo.ascx
@@ -4114,9 +4144,9 @@ msgid "Permissions"
msgstr "Permissions"
#: ~/Modules/Orchard.Roles/Views/Admin/Edit.aspx
#| msgid "{0} Module"
msgid "{0} Module"
msgstr "Module {0}"
#| msgid "{0} Feature"
msgid "{0} Feature"
msgstr "Fonctionnalité {0}"
#: ~/Modules/Orchard.Roles/Views/Admin/Edit.aspx
#| msgid "Permission"
@@ -4398,6 +4428,11 @@ msgstr "L'étiquette n'a pas pu être effacée."
msgid "Editing tags failed: "
msgstr "La modification des étiquettes a échoué: "
#: ~/Modules/Orchard.Tags/Controllers/AdminController.cs
#| msgid "Couldn't create tag"
msgid "Couldn't create tag"
msgstr "L'étiquette n'a pas pu être créée."
#: ~/Modules/Orchard.Tags/Controllers/AdminController.cs
#| msgid "The tag {0} already exists"
msgid "The tag {0} already exists"
@@ -5053,7 +5088,7 @@ msgstr "Modifier"
msgid "Posted by {0} {1}"
msgstr "Posté par {0} {1}"
#: ~/Themes/Classic/Views/DisplayTemplates/Parts/Pages.Page.Metadata.ascx
#: ~/Themes/Classic/Views/DisplayTemplates/Parts/Common.Metadata.ascx
#| msgid "nobody(?)"
msgid "nobody(?)"
msgstr "personne(?)"
@@ -5073,7 +5108,7 @@ msgstr "Modifier"
msgid "Posted by {0} {1}"
msgstr "Posté par {0} {1}"
#: ~/Themes/ClassicDark/Views/DisplayTemplates/Parts/Pages.Page.Metadata.ascx
#: ~/Themes/ClassicDark/Views/DisplayTemplates/Parts/Common.Metadata.ascx
#| msgid "nobody(?)"
msgid "nobody(?)"
msgstr "personne(?)"
@@ -5129,8 +5164,8 @@ msgid "Log Off"
msgstr "Déconnexion"
#: ~/Themes/Contoso/Views/User.ascx
#| msgid "Login"
msgid "Login"
#| msgid "Log on"
msgid "Log on"
msgstr "Connexion"
#: ~/Themes/Contoso/Views/DisplayTemplates/Items/Blogs.BlogPost.ListByArchive.ascx
@@ -5183,6 +5218,11 @@ msgstr "Bonjour {0}!"
msgid "Comment"
msgstr "Commentaire"
#: ~/Themes/Contoso/Views/DisplayTemplates/Parts/Comments.Comments.ascx
#| msgid "<span class='CommentUserName'>Leave a comment {0}!</span>"
msgid "<span class='CommentUserName'>Leave a comment {0}!</span>"
msgstr "<span class='CommentUserName'>Laissez-nous un commentaire, {0}!</span>"
#: ~/Themes/Contoso/Views/DisplayTemplates/Parts/Comments.Comments.ascx
#| msgid "Submit Comment"
msgid "Submit Comment"
@@ -5308,6 +5348,11 @@ msgstr "Commentaire"
msgid "Submit Comment"
msgstr "Envoyer le commentaire"
#: ~/Themes/Corporate/Views/DisplayTemplates/Parts/Common.Metadata.ascx
#| msgid "nobody(?)"
msgid "nobody(?)"
msgstr "personne(?)"
#: ~/Themes/Green/Views/DisplayTemplates/Parts/Common.Metadata.ascx
#| msgid "nobody(?)"
msgid "nobody(?)"

View File

@@ -12,6 +12,7 @@
.content-localization .content-localizations li,
.content-localization .add-localization {
font-size:1.2em;
float:left;
}
.content-localization .content-localizations>* {
display:inline-block;

View File

@@ -7,7 +7,7 @@ html.dyn input.hinted {
font-style:italic;
}
input#PublishLater_ScheduledPublishUtcDate {
width:56%;
width:50%;
}
input#PublishLater_ScheduledPublishUtcTime {
width:36%;

View File

@@ -125,7 +125,7 @@ namespace Lucene.Services {
.Delete(true);
var settingsFileName = GetSettingsFileName(indexName);
if(File.Exists(settingsFileName)) {
if (File.Exists(settingsFileName)) {
File.Delete(settingsFileName);
}
}
@@ -139,7 +139,7 @@ namespace Lucene.Services {
}
public void Store(string indexName, IEnumerable<LuceneDocumentIndex> indexDocuments) {
if(indexDocuments.AsQueryable().Count() == 0) {
if (indexDocuments.AsQueryable().Count() == 0) {
return;
}
@@ -151,7 +151,7 @@ namespace Lucene.Services {
try {
foreach ( var indexDocument in indexDocuments ) {
foreach (var indexDocument in indexDocuments) {
current = indexDocument;
var doc = CreateDocument(indexDocument);
@@ -159,7 +159,7 @@ namespace Lucene.Services {
Logger.Debug("Document [{0}] indexed", indexDocument.ContentItemId);
}
}
catch ( Exception ex ) {
catch (Exception ex) {
Logger.Error(ex, "An unexpected error occured while add the document [{0}] from the index [{1}].", current.ContentItemId, indexName);
}
finally {

View File

@@ -47,6 +47,7 @@ namespace Lucene.Services {
InitPendingClause();
}
public ISearchBuilder Parse(string defaultField, string query) {
return Parse(new string[] {defaultField}, query);
}

View File

@@ -1,4 +1,5 @@
using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement.FieldStorage.InfosetStorage;
using Orchard.ContentManagement.Handlers;
using Orchard.ContentManagement;
using Orchard.Core.Common.Models;
using Orchard.Tasks.Indexing;
@@ -21,16 +22,18 @@ namespace Orchard.Indexing.Handlers {
_indexingTaskManager = indexingTaskManager;
_indexNotifierHandlers = indexNotifierHandlers;
OnPublishing<ContentPart<CommonPartRecord>>(CreateIndexingTask);
OnRemoved<ContentPart<CommonPartRecord>>(RemoveIndexingTask);
OnPublishing<ContentPart>(CreateIndexingTask);
OnRemoved<ContentPart>(RemoveIndexingTask);
}
void CreateIndexingTask(PublishContentContext context, ContentPart<CommonPartRecord> part) {
void CreateIndexingTask(PublishContentContext context, ContentPart part) {
_indexingTaskManager.CreateUpdateIndexTask(context.ContentItem);
// UpdateIndex();
}
void RemoveIndexingTask(RemoveContentContext context, ContentPart<CommonPartRecord> part) {
void RemoveIndexingTask(RemoveContentContext context, ContentPart part) {
_indexingTaskManager.CreateDeleteIndexTask(context.ContentItem);
// UpdateIndex();
}
private void UpdateIndex() {

View File

@@ -13,15 +13,20 @@ namespace Orchard.Indexing.Handlers {
OnIndexing<InfosetPart>(
(context, cp) => {
var infosetPart = context.ContentItem.As<InfosetPart>();
if ( infosetPart != null ) {
foreach ( var part in infosetPart.ContentItem.Parts ) {
foreach ( var field in part.PartDefinition.Fields ) {
if ( field.Settings.GetModel<FieldIndexing>().Included ) {
var fieldName = field.Name;
var value = part.Fields.Where(f => f.Name == fieldName).First().Storage.Get<string>(null);
context.DocumentIndex.Add(String.Format("{0}-{1}", infosetPart.TypeDefinition.Name, fieldName.ToLower()), value).RemoveTags().Analyze();
}
if (infosetPart == null) {
return;
}
// part fields
foreach ( var part in infosetPart.ContentItem.Parts ) {
foreach ( var field in part.PartDefinition.Fields ) {
if (!field.Settings.GetModel<FieldIndexing>().Included) {
continue;
}
var fieldName = field.Name;
var value = part.Fields.Where(f => f.Name == fieldName).First().Storage.Get<string>(null);
context.DocumentIndex.Add(String.Format("{0}-{1}", infosetPart.TypeDefinition.Name.ToLower(), fieldName.ToLower()), value).RemoveTags().Analyze();
}
}
});

View File

@@ -103,8 +103,10 @@ namespace Orchard.Indexing.Services {
// nothing to do ?
if (taskRecords.Length + updateIndexDocuments.Count == 0)
if (taskRecords.Length + updateIndexDocuments.Count == 0) {
Logger.Information("Index update requested, nothing to do");
return;
}
Logger.Information("Processing {0} indexing tasks", taskRecords.Length);

View File

@@ -2,20 +2,25 @@
using Orchard.Environment;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Models;
using Orchard.Localization;
using Orchard.Packaging.Services;
using Orchard.UI.Notify;
namespace Orchard.Packaging {
[OrchardFeature("Gallery")]
public class DefaultPackagingUpdater : IFeatureEventHandler {
private readonly IPackagingSourceManager _packagingSourceManager;
private readonly INotifier _notifier;
public DefaultPackagingUpdater(IPackagingSourceManager packagingSourceManager) {
public DefaultPackagingUpdater(IPackagingSourceManager packagingSourceManager, INotifier notifier) {
_packagingSourceManager = packagingSourceManager;
_notifier = notifier;
}
public Localizer T { get; set; }
public void Install(Feature feature) {
// add http://orchardproject.net/feeds/modules as the default Modules Feed
_packagingSourceManager.AddSource(new PackagingSource { Id = Guid.NewGuid(), FeedTitle = "Orchard Module Gallery", FeedUrl = "http://orchardproject.net/feeds/modules" });
_packagingSourceManager.AddSource(new PackagingSource { Id = Guid.NewGuid(), FeedTitle = "Orchard Module Gallery", FeedUrl = "http://orchardproject.net/gallery/feed" });
}
public void Enable(Feature feature) {

View File

@@ -8,32 +8,38 @@ using System.Xml.Linq;
using System.Xml.Serialization;
using Orchard.Environment.Extensions;
using Orchard.FileSystems.AppData;
using Orchard.Localization;
using Orchard.UI.Notify;
namespace Orchard.Packaging.Services {
[OrchardFeature("PackagingServices")]
public class PackagingSourceManager : IPackagingSourceManager {
private static readonly XmlSerializer _sourceSerializer = new XmlSerializer(typeof (List<PackagingSource>), new XmlRootAttribute("Sources"));
private static readonly XmlSerializer _sourceSerializer = new XmlSerializer(typeof(List<PackagingSource>), new XmlRootAttribute("Sources"));
private readonly IAppDataFolder _appDataFolder;
private readonly INotifier _notifier;
public PackagingSourceManager(IAppDataFolder appDataFolder) {
public PackagingSourceManager(IAppDataFolder appDataFolder, INotifier notifier) {
_appDataFolder = appDataFolder;
_notifier = notifier;
T = NullLocalizer.Instance;
}
Localizer T { get; set; }
#region IPackagingSourceManager Members
public IEnumerable<PackagingSource> GetSources() {
string text = _appDataFolder.ReadFile(GetSourcesPath());
if (string.IsNullOrEmpty(text)) {
if ( string.IsNullOrEmpty(text) ) {
return Enumerable.Empty<PackagingSource>();
}
var textReader = new StringReader(_appDataFolder.ReadFile(GetSourcesPath()));
return (IEnumerable<PackagingSource>) _sourceSerializer.Deserialize(textReader);
return (IEnumerable<PackagingSource>)_sourceSerializer.Deserialize(textReader);
}
public void AddSource(PackagingSource source) {
UpdateSource(source);
SaveSources(GetSources().Concat(new[] {source}));
SaveSources(GetSources().Concat(new[] { source }).GroupBy(x => x.FeedUrl).Select(g => g.First()));
}
public void RemoveSource(Guid id) {
@@ -41,16 +47,16 @@ namespace Orchard.Packaging.Services {
}
public void UpdateLists() {
foreach (PackagingSource source in GetSources()) {
foreach ( PackagingSource source in GetSources() ) {
UpdateSource(source);
}
}
public IEnumerable<PackagingEntry> GetModuleList(PackagingSource packagingSource = null) {
IEnumerable<PackagingEntry> packageInfos = ( packagingSource == null ? GetSources() : new [] { packagingSource })
IEnumerable<PackagingEntry> packageInfos = ( packagingSource == null ? GetSources() : new[] { packagingSource } )
.SelectMany(
source =>
Bind(ParseFeed(_appDataFolder.ReadFile(GetFeedCachePath(source))),
Bind(ParseFeed(GetModuleListForSource(source)),
feed =>
feed.Items.SelectMany(
item =>
@@ -65,6 +71,13 @@ namespace Orchard.Packaging.Services {
return packageInfos.ToArray();
}
private string GetModuleListForSource(PackagingSource source) {
if ( !_appDataFolder.FileExists(GetFeedCachePath(source)) ) {
UpdateSource(source);
}
return _appDataFolder.ReadFile(GetFeedCachePath(source));
}
#endregion
private static string GetSourcesPath() {
@@ -83,8 +96,13 @@ namespace Orchard.Packaging.Services {
}
private void UpdateSource(PackagingSource source) {
XDocument feed = XDocument.Load(source.FeedUrl, LoadOptions.PreserveWhitespace);
_appDataFolder.CreateFile(GetFeedCachePath(source), feed.ToString(SaveOptions.DisableFormatting));
try {
XDocument feed = XDocument.Load(source.FeedUrl, LoadOptions.PreserveWhitespace);
_appDataFolder.CreateFile(GetFeedCachePath(source), feed.ToString(SaveOptions.DisableFormatting));
}
catch ( Exception e ) {
_notifier.Warning(T("Error loading content of feed '{0}': {1}", source.FeedUrl, e.Message));
}
}
@@ -93,7 +111,7 @@ namespace Orchard.Packaging.Services {
}
private static IEnumerable<T> Unit<T>(T t) where T : class {
return t != null ? new[] {t} : Enumerable.Empty<T>();
return t != null ? new[] { t } : Enumerable.Empty<T>();
}
private static IEnumerable<T2> Bind<T, T2>(T t, Func<T, IEnumerable<T2>> f) where T : class {
@@ -101,6 +119,9 @@ namespace Orchard.Packaging.Services {
}
private SyndicationFeed ParseFeed(string content) {
if ( string.IsNullOrEmpty(( content )) )
return new SyndicationFeed();
var formatter = new Atom10FeedFormatter<SyndicationFeed>();
formatter.ReadFrom(XmlReader.Create(new StringReader(content)));
return formatter.Feed;

View File

@@ -0,0 +1,17 @@
.moduleName {
float:left;
}
.contentItems .related {
padding:1.2em 0.4em 0.5em
}
.contentItems .properties {
float:none;
clear:both;
}
.contentItems .pageStatus {
margin:.8em 0;
color:#666;
}

View File

@@ -1,4 +1,6 @@
<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<Orchard.Packaging.ViewModels.PackagingModulesViewModel>" %>
<% Html.RegisterStyle("admin.css"); %>
<h1>
<%: Html.TitleForPage(T("Browse Gallery").ToString())%></h1>
@@ -25,21 +27,22 @@
<ul class="contentItems">
<%foreach (var item in Model.Modules) {%>
<li>
<ul class="summary">
<div class="properties">
<div class="moduleName">
<h2><%: (item.SyndicationItem.Title == null ? T("(No title)").Text : item.SyndicationItem.Title.Text)%><span> - <%: T("Version: {0}", "1.0")%></span></h2>
<p><%: (item.SyndicationItem.Summary == null ? T("(No description").Text : item.SyndicationItem.Summary.Text) %></p>
<ul class="pageStatus" style="color:#666; margin:.6em 0 0 0;">
<li><%: T("Last Updated: {0}", item.SyndicationItem.LastUpdatedTime.ToLocalTime()) %></li>
<li>&nbsp;&#124;&nbsp;<%: T("Author: {0}", item.SyndicationItem.Authors.Any() ? String.Join(", ", item.SyndicationItem.Authors.Select(a => a.Name)) : T("Unknown").Text)%></li>
</ul>
</div>
<div class="related">
<%:Html.ActionLink(T("Install").ToString(), "Install", new RouteValueDictionary {{"SyndicationId",item.SyndicationItem.Id}})%><%:T(" | ") %>
<a href="<%:item.PackageStreamUri%>"><%: T("Download") %></a>
</div>
</div>
</ul>
<div class="properties">
<p><%: (item.SyndicationItem.Summary == null ? T("(No description").Text : item.SyndicationItem.Summary.Text) %>The sandbox module is a testing ground for Orchard developers and should not be activated except for testing and development purposes.</p>
<ul class="pageStatus">
<li><%: T("Last Updated: {0}", item.SyndicationItem.LastUpdatedTime.ToLocalTime()) %></li>
<li>&nbsp;&#124;&nbsp;<%: T("Author: {0}", item.SyndicationItem.Authors.Any() ? String.Join(", ", item.SyndicationItem.Authors.Select(a => a.Name)) : T("Unknown").Text)%></li>
</ul>
</div>
</li><%
}%>
</ul><%

View File

@@ -379,6 +379,7 @@ span.message {
}
.content-localization .content-localizations li:hover {
background-color: #000;
border-color: #99ff66;
}
.content-localization .content-localizations li a {
text-decoration: none;

View File

@@ -425,6 +425,7 @@ html, body {background-color: #FFFFFF; background-image: url(../Content/Images/b
.content-localization .content-localizations ul {
overflow: auto;
list-style-type:none;
}

View File

@@ -1,3 +1,13 @@
.contentItems {
border:1px solid #D3D2D2;
}
button, .button, .button:link, .button:visited {
cursor:pointer;
padding:0.1em 0.8em 0.2em 0.8em;
text-align:center;
}
.button {
line-height:inherit;
}

View File

@@ -445,7 +445,7 @@ label input {
}
/* todo: (heskew) try to get .text on stuff like .text-box */
select, textarea, input.text, input.textMedium, input.text-box {
padding:1px;
padding:3px;
border:1px solid #bdbcbc;
}
input.text, input.textMedium, input.text-box {
@@ -454,6 +454,9 @@ input.text, input.textMedium, input.text-box {
input.textMedium {
width:26em;
}
select {
padding:1px;
}
select:focus, textarea:focus, input.text:focus, input.text-box:focus {
border-color:#666d51;
}
@@ -472,7 +475,6 @@ textarea {
min-height:8em;
}
#main input.large.text, #main textarea {
padding:4px;
width:99%;
}
#main .primary input.large.text, #main .primary textarea {
@@ -635,6 +637,7 @@ button.ibutton {
/* (Items) Tables
----------------------------------------------------------*/
table.items {
margin:0 0 1.4em 0;
background:#fff;
border:1px solid #eaeaea;
border-bottom:none;

View File

@@ -105,6 +105,9 @@ namespace Orchard.Data {
private Hash ComputeHash() {
var hash = new Hash();
hash.AddString(_shellSettings.DataProvider);
hash.AddString(_shellSettings.DataTablePrefix);
hash.AddString(_shellSettings.DataConnectionString);
hash.AddString(_shellSettings.Name);
// We need to hash the assemnly names, record names and property names

View File

@@ -3,7 +3,7 @@ using System.Collections.Generic;
using Orchard.ContentManagement;
namespace Orchard.Indexing {
public interface IIndexProvider : IDependency {
public interface IIndexProvider : ISingletonDependency {
/// <summary>
/// Creates a new index
/// </summary>

View File

@@ -12,6 +12,8 @@ namespace Orchard.Utility {
public string Value { get { return _hash.ToString(); } }
public void AddString(string value) {
if ( string.IsNullOrEmpty(value) )
return;
_hash += value.GetHashCode();
}

View File

@@ -15,13 +15,13 @@ using PackageIndexReferenceImplementation.Services;
namespace PackageIndexReferenceImplementation.Controllers {
[HandleError]
public class ModulesController : Controller {
public class FeedController : Controller {
private readonly FeedStorage _feedStorage;
private readonly MediaStorage _mediaStorage;
public IMembershipService MembershipService { get; set; }
public ModulesController() {
public FeedController() {
_feedStorage = new FeedStorage();
_mediaStorage = new MediaStorage();
if ( MembershipService == null ) { MembershipService = new AccountMembershipService(); }

View File

@@ -72,7 +72,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Controllers\AccountController.cs" />
<Compile Include="Controllers\ModulesController.cs" />
<Compile Include="Controllers\FeedController.cs" />
<Compile Include="Controllers\Artifacts\AtomFeedResult.cs" />
<Compile Include="Controllers\Artifacts\AtomItemResult.cs" />
<Compile Include="Controllers\Artifacts\ContentTypeAttribute.cs" />

View File

@@ -7,7 +7,7 @@
<asp:Content ID="loginContent" ContentPlaceHolderID="MainContent" runat="server">
<h2>Log On</h2>
<p>
Please enter your username and password. <%: Html.ActionLink("Register", "Register") %> if you don't have an account.
Please enter your username and password.
</p>
<% using (Html.BeginForm()) { %>