2013-12-11 31 views
0

我一直在關注本教程Extending Identity Accounts and Implementing Roles。我沒有實現一些我不需要的刪除方法,我將ApplicationUser.userName屬性設置爲一個電子郵件地址。這些是我的項目的限制。發送郵件地址作爲MVC5中的參數導致網站崩潰

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

一旦我加載的AccountController MYHOST /的指標帳戶就說明這個

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

錯誤detiled信息

I'll只是把標籤。

模塊 通知 控制器。 StatisFile(這是不是在我的網站控制器) 錯誤代碼 請求的URL 物理訪問路線 會話啓動方法 會話啓動用戶 通話目錄錯誤的

然而,問題是在urland是由URL中的@符號引起的。如果我將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

你的表單設置如何?因爲當你使用form和formmethod POST的mvc模型時,理論上你不應該有這個問題。你能告訴我們cshtml代碼嗎? – Silvermind

+0

我剛剛更新了包括帳戶控制器索引完整cshtml在內的問題 –

+0

如果將添加到您的web.config中,它會工作嗎? –

回答

0

如果使用標準的路由設置:嘗試改變

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

到:

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

只是爲了看看它是否工作。如果是這樣,現在失敗的原因是路由需要一個名爲id的參數。

+0

正如我在評論中曝光的那樣。它旨在發送用戶名不是id,但變量名稱是錯誤類型的。我不認爲這實際上可以拋出錯誤。編譯器在乎我如何命名它? –

+0

默認路由尋找稱爲id的參數。因此,重命名參數可以確認或拒絕我的路由問題理論。如果你嘗試了這一點,它可以工作,我可以給你一些關於如何改變行爲以適應你的要求的提示。 – Zaphod