私は、アンケートのプラットフォームをすべての店舗リストのスコアとともに使用しています。ASP.NET MVC 5のアイデンティティユーザーに基づいてエンティティのフィルタを構築する
私は各ユーザーに、自分の地域のエリア(地域)に基づいて店舗を利用できるようにする必要があります。
私は私のMVCプロジェクトにMicrosoftアイデンティティを使用して、私はこのために2つだけaproachesが見つかりました:
1-各地域のプロファイルを構築し、私はログオンしたユーザーのプロファイル名に基づいてフィルタリングすることができますが - dbContext.Where(位置==プロファイル名)
2-領域を含むApplicationUserを拡張するので、私はdbContext.Where(位置== User.Identity.GetLocation())
または任意の他のオプションを使用してフィルタリングすることができますか?
私は2番目のオプションを実装することができました:
店舗モデル:
public enum PTLocationDistrict
{
[Display(Name = "Aveiro")]
Aveiro = 1,
[Display(Name = "Beja")]
Beja = 2,
[Display(Name = "Braga")]
Braga = 3
}
[Table("Stores")]
public class Store
{
[Key]
public int Id { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateModified { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public PTLocationDistrict District { get; set; }
}
アイデンティティApplicationUser:
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
userIdentity.AddClaim(new Claim("PTLocationDistrict", this.PTLocationDistrict.ToString()));
return userIdentity;
}
// Additional properties for the Application User
public PTLocationDistrict? PTLocationDistrict { get; set; }
}
アイデンティティサービス:
public static PTLocationDistrict? GetPTLocationDistrict(this IIdentity identity)
{
Claim claim = ((ClaimsIdentity)identity).FindFirst("PTLocationDistrict");
PTLocationDistrict value;
if (claim == null)
{
return null;
}
else if (Enum.TryParse(claim.Value, out value))
{
return value;
}
else
{
return null;
}
}
Dashbをoardレポートカウントサービス:
public int GetCountToday(PTLocationDistrict? ptLocationDistrict)
{
try
{
var today = DateTime.Today;
IQueryable<SurveySession> surveySessions = _dbContext.SurveySessions.AsNoTracking().AsQueryable();
if (ptLocationDistrict != null)
{
surveySessions = surveySessions.Where(ss => ss.Location.District == ptLocationDistrict.Value);
}
int count = surveySessions
.Where(p => p.DateCreated >= today)
.Count();
return count;
}
catch (Exception error)
{
_logger.Error("[Error in SurveyService.GetCountToday" - Error: " + error + "]");
return 0;
}
}
コントローラーアクション:
public virtual ActionResult Index()
{
IndexViewModel model = new IndexViewModel();
PTLocationDistrict? ptLocationDistrict = User.Identity.GetPTLocationDistrict();
// Realizados Hoje
model.SurveyCountToday = _surveyService.GetCountToday(ptLocationDistrict);
}
私はこの質問が少し広いと思います。一つは、どのように位置を決定していますか? Georouting? – nurdyguy
こんにちは、ありがとう!ユーザーの場所は、店舗リストをフィルタリングする国の地域(この場合はポルトガル)のリストに基づいて、登録プロセスで指定されます。 – Patrick
傍注として:PTLocationDistrictをnullableとして実装しません。代わりに* None = 0 *を追加し、これをデフォルトに設定します。 –