簡體   English   中英

在不公開敏感ID的情況下向父視圖的許多局部視圖提供ID

[英]Supplying a ID to many partial views from a parent view without exposing sensitive ID's

我們正在使用友好的名稱URL路由方案。 基本上使用主體身份和友好名稱的組合,可以將其映射回內部身份(人員ID)。 所以這樣的路線:

    routes.MapRoute(string.Empty, "{friendlyname}/Products/{action}", new {controller = "Products", action = "List"});

將映射到這樣的URL:

    Adam/Products/List

所有這些都可以正常工作,並且抽象出了所需的指定人的內部ID。

問題在於我們的視圖包含許多局部視圖。 當使用@ Html.Action方法進行渲染時,它們最終需要PersonID,但是從URL中我們只有“好記的名稱”。

我已經考慮了一段時間,有兩種解決方案:

  1. 將“好記的名稱”傳遞到返回部分視圖的每個控制器操作方法中,並且在內部該方法將必須對當前登錄的標識和好記的名稱進行查找。 這將給我PersonID,然后我便可以有效地進行查詢。 這種方法的唯一問題是,由於存在多個局部視圖,因此我將針對每個局部視圖調用innefficeint查詢當前登錄的身份和友好名稱,我覺得我只需要編寫一次此代碼。

  2. 以某種方式在視圖中查詢並獲取PersonID,以便可以將其傳遞給每個@ Html.Action調用,因此部分視圖控制器方法不必自己執行該查找,從而可以為相同的共享信息往返數據庫。 問題是我不確定在視圖中使用我們在整個應用程序其余部分中使用的DI來執行此cleanley的方法。

任何對方法的想法將不勝感激。

謝謝,

亞當

您可以將Id添加到會話變量中,並通過以下方式從視圖中進行訪問:

@{var personId = int.Parse(Session["PersonId"])}

然后,您可以將其直接傳遞給父級的部分視圖,而無需點擊客戶端或將參數傳遞給任何控制器。

更新資料

如果您想在那里進行工作,而無需往返數據庫,也可以從Controller訪問session變量。

編輯

如果將屬性放入模型中並將其傳遞到帖子背面的頁面,則模型將不會在帖子之間持久存在。

例如,如果您的控制器這樣做:

[HttpPost]
public ActionResult DoSomething(ViewModel model)
{
   if(ModelState.IsValid)
   {
       // Logic Here
   }
   return View(model)
}

重新加載頁面時,該模型將忘記該ID。

有兩種解決方法。 使用@ Html.HiddenFor(m => m.ID)會將屬性放入呈現的HTML中,如果這確實是一條敏感信息,那就不好了。

或者,您可以在每個后續回發中重建視圖模型。

希望這可以幫助

正如Marc所言,我可以邀請您本屆會議來處理此問題,但是我已經按照他在更新中所述的那樣使用了模型。 如果父級View Controller操作采用友好名稱,則可以進行查找,將PersonID放入模型中,然后任何部分渲染器都可以在父級View Controllers Action的視圖中將模型值傳遞給它們。 下面顯示了一個示例(這是演示代碼,但希望可以理解這一點,我永遠不會在實際代碼中使用靜態數據上下文)

家庭控制器

public class HomeController : Controller
{
    public ActionResult Index(string friendlyName)
    {
        int pupilId = Data.People.Single(x => x.Name == friendlyName).PersonId;
        HomeIndexViewModel homeIndexViewModel = new HomeIndexViewModel {PupilId = pupilId};

        return View(homeIndexViewModel);
    }
}

主頁索引視圖

@model SharingInformationBetweenPartials.Web.Models.HomeIndexViewModel
@{
    ViewBag.Title = "Index";
}
<h2>Index</h2>    
@Html.Action("DisplayPersonDetail", "Person", new {Model.PersonId})

然后,PersonController的DisplayPersonDetail方法可以使用傳入的PersonId呈現所需的各個數據:

public class PupilController : Controller
{
    [ChildActionOnly]
    public ActionResult DisplayPupilDetail(int pupilId)
    {
        Person person = Data.People.Single(x => x.PersonId == pupilId);
        return View(person);
    }
}

我確實嘗試過以前的想法,但是由於URL中顯示了ViewModels屬性,所以我一定有問題,這是我試圖擺脫的。 無論如何,我希望這對其他可能希望做類似事情的人有所幫助。 如果您有任何疑問,請告訴我。

謝謝,

亞當

您可以使用[Bind]屬性指定模型聯編程序應包含在綁定中的確切屬性,也可以使用該屬性上的Exclude參數排除PersonId

[HttpPost]
public ActionResult EditPerson([Bind(Exclude = "PersonId")] Person person)
{
    //do domething
}

您也可以使用模型聯編程序可以理解的[ReadOnly]屬性,而不分配給該屬性。

[ReadOnly(true)]
public int PersonId{ get; set; }

但是最好的方法是使用單獨的ViewModel:一個僅用於查看,另一個用於編輯。

public abstract class Person
{
   public string Name { get; set; }
   public string Surname { get; set; }

}

public class PersonCreateVM : Person
{
   //no PersonId here
}

public class PersonEditVM : Person
{
   public int PersonId{ get; set; }
}

這種方法可能是“過度殺傷力”,但是當與AutoMapper http://automapper.codeplex.com/一起正確使用時,使用起來很容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM