在MVC5中将邮件地址作为参数发送会导致站点崩溃

时间:2013-12-11 20:18:40

标签: c# asp.net-mvc-5

我一直在Extending Identity Accounts and Implementing Roles上关注本教程。我没有实现一些我不需要的删除方法,我将ApplicationUser.userName属性设置为电子邮件地址。这些是我项目的限制。

除用户版和角色分配外,一切正常。

一旦我加载了AccountController Myhost / Account的索引,它就显示了这个

http://local:17353/Account

但每当我尝试点击“编辑”或“角色”链接时,它会像这样奇怪地崩溃。 MYHOST /帐户/编辑/用户名%40gmail.com

Myhost/Account/Edit/username%40gmail.com

我刚刚意识到这个系统是西班牙语,所以我在这里翻译错误。 错误HTTP 404.0 - 不是FOund 您查找的资源已被删除,名称已更改或暂时无法使用。

原因 指定的目录或文件不在服务器上 url地址有类型错误 过滤器,自定义模块,URLScan,限制文件访问

你可以尝试什么 在Web服务器上创建内容 检查浏览器上的URL 检查错误调用的注册表,以查看哪个模块调用SetStatus。要获得更多信息,请单击此处(http://go.microsoft.com/fwlink/?LinkID=66439

错误提取信息

我只是贴上标签。

模块 通知 控制器。 StatisFile(这不是我网站上的控制器) 错误代码 请求网址 物理通路 会话启动方法 会话启动用户 呼叫目录

错误结束

然而,urland上的问题是由url中的@符号引起的。如果我将网址重写为Myhost / Account / Edit?username = username%40gmail.com,则正确加载编辑表单。

enter image description here

如何强制参数作为查询字符串参数?或者,有没有办法让服务器以标准方式理解邮件地址?

调用的方法是

[Authorize(Roles = "Admin")]
public ActionResult Edit(string userName, ManageMessageId? Message = null)
{
        var db = new ApplicationDbContext();
        var user = db.Users.First(u => u.UserName == userName);
        var model = new EditUserViewModel(user);
        ViewBag.MessageId = Message;
        return View(model);
}

UPDATE 正如您在评论中提到的,这是索引视图

@model IEnumerable<CAEWebSite.Models.EditUserViewModel>

@{
    ViewBag.Title = "Index";
}

<h2>Usuarios</h2>

<p>
@Html.ActionLink("Nuevo usuario", "Register")
</p>
<table class="table">
<tr>
    <th>
        @Html.DisplayNameFor(model => model.UserName)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.FirstName)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.MiddleName)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.LastName)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.SecondLastName)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Email)
    </th>
    <th></th>
</tr>

@foreach (var item in Model)
{
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.UserName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FirstName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.MiddleName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.LastName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.SecondLastName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Email)
        </td>
        <td>
            @Html.ActionLink("Editar", "Edit", new { id = item.UserName }) |
            @Html.ActionLink("Roles", "UserRoles", new { id = item.UserName }) |
            @*@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })*@
        </td>
    </tr>
}

</table>

更新2

这是我的RouteConfig类,就像VS生成它一样

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );


    }
}

1 个答案:

答案 0 :(得分:0)

如果您使用标准路由设置:尝试更改

public ActionResult Edit(string userName, ManageMessageId? Message = null)

为:

public ActionResult Edit(string id, ManageMessageId? Message = null)

看它是否有效。如果是这样,它现在失败的原因是路由需要一个名为id的参数。