C# 母版页中的ASP.NET MVC2登录表单
我试图找到一种在母版页中使用登录表单的优雅方式。这意味着除非用户登录,否则登录表单应该出现在每个页面上。(这在现在很常见) 以Visual Studio中MVC2应用程序附带的示例为例,我创建了以下内容:C# 母版页中的ASP.NET MVC2登录表单,c#,asp.net-mvc-2,master-pages,login-control,C#,Asp.net Mvc 2,Master Pages,Login Control,我试图找到一种在母版页中使用登录表单的优雅方式。这意味着除非用户登录,否则登录表单应该出现在每个页面上。(这在现在很常见) 以Visual Studio中MVC2应用程序附带的示例为例,我创建了以下内容: public class MasterViewModel { public string User { get; set; } // omitted validation attributes public string Pass{ get; set; } public
public class MasterViewModel
{
public string User { get; set; } // omitted validation attributes
public string Pass{ get; set; }
public bool RememberMe { get; set; }
}
每个视图模型都继承自MasterViewModel
public class RegisterViewModel : MasterViewModel
{
public string UserName { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string ConfirmPassword { get; set; }
}
我的母版页呈现部分视图
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<MyLogon.ViewModels.MasterViewModel>" %>
.....
<div id="logindisplay">
<% Html.RenderPartial("LogOn"); %>
</div>
......
.....
......
强类型局部视图:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyLogon.ViewModels.MasterViewModel>" %>
<%
if (Request.IsAuthenticated) {
%>
Welcome <b><%= Html.Encode(Page.User.Identity.Name) %></b>!
<div>[ <%= Html.ActionLink("Change Password", "ChangePassword", "Account") %> ]</div>
<div>[ <%= Html.ActionLink("Log Off", "LogOff", "Account") %> ]</div>
<%
}
else {
%>
<%= Html.ValidationSummary(true, "Login was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm("LogOn", "Account",FormMethod.Post)) { %>
<div>
<fieldset>
<legend>Account Information</legend>
<div class="editor-label">
<%= Html.LabelFor(m => m.User) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(m => m.User) %>
<%= Html.ValidationMessageFor(m => m.User) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(m => m.Pass) %>
</div>
<div class="editor-field">
<%= Html.PasswordFor(m => m.Pass) %>
<%= Html.ValidationMessageFor(m => m.Pass) %>
</div>
<div class="editor-label">
<%= Html.CheckBoxFor(m => m.RememberMe) %>
<%= Html.LabelFor(m => m.RememberMe) %>
</div>
<p>
<input type="submit" value="Log On" />
</p>
</fieldset>
</div>
<% } %>
<%
}
%>
欢迎
[ ]
[ ]
帐户信息
m、 用户)%%>
m、 用户)%%>
m、 用户)%%>
m、 通过)%>
m、 通过)%>
m、 通过)%>
m、 记住)%>
m、 记住)%>
注册页面:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyLogon.Models.RegisterViewModel>" %>
...
<h2>Create a New Account</h2>
<p>
Use the form below to create a new account.
</p>
<p>
Passwords are required to be a minimum of <%= Html.Encode(ViewData["PasswordLength"]) %> characters in length.
</p>
<% using (Html.BeginForm("Register", "Account" ,FormMethod.Post))
{ %>
<%= Html.ValidationSummary(true, "Account creation was unsuccessful. Please correct the errors and try again.") %>
<div>
<fieldset>
<legend>Account Information</legend>
<div class="editor-label">
<%= Html.LabelFor(m => m.UserName) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(m => m.UserName) %>
<%= Html.ValidationMessageFor(m => m.UserName) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(m => m.Email) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(m => m.Email) %>
<%= Html.ValidationMessageFor(m => m.Email) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(m => m.Password) %>
</div>
<div class="editor-field">
<%= Html.PasswordFor(m => m.Password) %>
<%= Html.ValidationMessageFor(m => m.Password) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(m => m.ConfirmPassword) %>
</div>
<div class="editor-field">
<%= Html.PasswordFor(m => m.ConfirmPassword) %>
<%= Html.ValidationMessageFor(m => m.ConfirmPassword) %>
</div>
<p>
<input type="submit" value="Register" />
</p>
</fieldset>
</div>
<% } %>
</asp:Content>
...
创建新帐户
使用下表创建新帐户。
密码的长度必须至少为个字符。
帐户信息
m、 用户名)%%>
m、 用户名)%%>
m、 用户名)%%>
m、 电子邮件)%%>
m、 电子邮件)%%>
m、 电子邮件)%%>
m、 密码)%%>
m、 密码)%%>
m、 密码)%%>
m、 确认密码)%%>
m、 确认密码)%%>
m、 确认密码)%%>
因为所有视图模型都继承自MasterViewModel登录,所以局部视图总是令人满意的,但我发现这个解决方案非常不雅观。是否有其他方法可以实现此目的?使用局部视图,但根据登录状态有不同的视图。为匿名用户返回一个视图,使用登录表单/lunk返回注册页面,为登录用户返回第二个视图 局部视图可以有自己的模型,这些模型不需要从主视图模型继承 继承模型以后可能会导致问题(这使得使用
html.EditForModel()
或.DisplayForModel()
很棘手,因为它们也会呈现公共主视图字段)
哦,一般来说,视图依赖于模型之外的任何东西都是不好的做法-您对请求的测试。IsAuthenticated
现在可能还可以,但是如果您想绝对正确,您应该拥有一个模型。IsAuthenticated
属性,该属性由操作设置。换言之,交换观点将完全消除这个问题
编辑:最后一项改进。在像这样的线上:
Welcome <b><%= Html.Encode(Page.User.Identity.Name) %></b>!
第一个将不会被html编码为EditFor()
返回HTMLString
。第二个将被编码(如果somefield
是标准字符串)
这将使您的代码更整洁、更健壮。您还可以使用它来动态生成HTML,如果您必须这样做并对其进行编码/不适当的话。例如,我们需要处理一些助手函数,包括CSS/JS。他们把戒指还给我
<%: Helper.IncludeCSS("SomeCSS.css") %>
“按原样使用部分视图,但根据登录状态有不同的视图。使用登录表单/lunk将匿名用户的一个视图返回到注册页面,并为登录用户返回第二个视图。”抱歉,我不知道是否正确。默认情况下,您描述的是MVC2应用程序。其想法是在用户登录之前,在每个页面上都进行登录。所以点击Register我会显示两个表单。我使用的是MVC,我唯一的经验是MVC2,所以我的信息可能会被怀疑是MVC。当然,在MVC2中,我会在母版页上有一个指向动作的RenderPartial。该操作将根据请求返回两个视图中的一个。IsAuthenticated。如果未经过身份验证,它将返回LogonPartial视图,否则将返回经过身份验证的视图。显然,其中一个是登录表单/注册链接,另一个是注销链接。FWWI强烈建议您考虑升级到2010,如果可能的话,有一些巨大的改进。
Welcome <b><%: model.Username %></b>!
<%: html.EditFor(x => x.fieldname) %>
<%: model.somefield %>
<%: Helper.IncludeCSS("SomeCSS.css") %>