1

我正在使用 C# Razor 和所有很棒的东西编写一个 MVC4 应用程序。它具有完整的登录名和密码以及额外的 2 个问题,用户才能登录。

在几个月前我启用登录功能之前,这是一个梦想,我只是在我感兴趣的页面上启动应用程序,它会加载让我立即看到我的结果。

有时我会从错误的页面开始,上帝保佑我可能需要额外点击一两次才能到达正确的页面。我认为这已经够糟糕了。

现在我已经启用了登录,并且对代码进行了几次修改,它已经通过了测试部门,并进入了大坏世界。我不允许再次禁用它。

我的替代方法是对测试用户名和密码进行硬编码,并使用所需的其他默认值进行固定,然后在发布时将其删除。感谢上帝的测试......我实际上把它们硬编码了一次。这足以教会我永远不要再这样做了。

然而,我从字面上毫不夸张地开始我的应用程序,每天可能数百次(尽管感觉就像数千次),而且每次我都必须填写这个可怕的登录表单。这是非常低效的,真的占用了我很多时间。它积极鼓励我养成不良的编程习惯,即一次更改几件事然后进行测试。一条我不想开始的路。

我的问题:是否有替代这种硬编码实践的方法可以让我恢复工作效率?

请不要建议让浏览器记住细节。我试过了,问题是我的应用程序必须跨浏览器和平台兼容,这意味着它不仅必须在 Windows 浏览器(本身有足够的变化)中运行,而且还必须在平板电脑、手机甚至 lunix 和 mac 上运行。因此,依靠浏览器记住细节根本不是一种选择。

有什么建议么。

根据下面的建议,我决定探索 web/user.config 路线,这是我迄今为止的尝试,但没有奏效。

模型:

public class LogOnModel
{
    [Required]
    [Display(Name = "User name")]
    [StringLength(255, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 8)]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    [StringLength(255, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    public string Password { get; set; }
}

控制器:

    public ActionResult Login()
    {
        LogOnModel model = new LogOnModel(); 
        model.UserName = ConfigurationManager.AppSettings["UserName"];
        model.Password = ConfigurationManager.AppSettings["Password"];

        return View("Login");
    }


    [HttpPost]
    public ActionResult Login(LogOnModel model, string returnUrl)
    {
        model.UserName = ConfigurationManager.AppSettings["UserName"];
        model.Password = ConfigurationManager.AppSettings["Password"];
        //I am aware that this will presently overwrite the incoming model if it exists.
        //I am just trying to get something work here and I will surround it with an if afterward.

        if (ModelState.IsValid)
        {
          ... Other code here
        }
          ... Other code here (there are a variety of returns this is a long method with lots of checks
    }

看法:

@model YeatsClinical.PatientPortal.Web.Models.LogOnModel

...Lots of other code...
@Html.TextBoxFor(x=>x.UserName,  new { @class = "m-wrap placeholder-no-fix", @placeholder="Username"})
...Lots of other code...
I didn't bother trying the password yet, I just wanted to get one thing working first.

网络配置:

<appSettings file="user.config">

用户配置

<appSettings>
    <add key="UserName" value ="someone@somewhere.com"/>
    <add key="Password" value ="password"/>
</appSettings>

不再有任何 web/user.config 错误或任何构建错误。它只是像以前一样加载带有占位符文本的格式良好的文本框。那么我哪里错了。再次感谢大家。

4

1 回答 1

3

将您的登录详细信息放在本地 web.config 文件中。您的代码将查找配置值,如果存在,将自动为您填写它们。您可以在部署时保留此代码 - 因为这些值不在生产中的配置文件中,所以您不必担心它在那里运行。

或者您可以将它们放在一个单独的配置文件中,例如user.config,并在您的主配置中引用它。您的user.config文件将永远不会被发布。只要确保您的部署实践没有引入此文件即可。

网络配置:

<configuration>
  <appSettings file="user.config">
    <!-- put your normal config values here -->
  </appSettings>
</configuration>

user.config(仅限您的本地计算机 - 不在源代码管理中,也不在服务器上)

<appSettings>
  <add key="defaultUser" value ="someUser"/>
  <add key="defaultPassword" value ="somePassword"/>
</appSettings>

另一种选择可能是使用条件编译,假设您在本地处于调试模式并以发布模式发布。

#if DEBUG
    PopulateTheUserCredentials();
#endif
于 2013-04-25T15:56:12.000 回答